【问题标题】:Python List Multiplication on Function Call [duplicate]函数调用上的Python列表乘法[重复]
【发布时间】:2015-09-13 03:51:11
【问题描述】:

我使用的是 Python 2.7,遇到了以下情况:

我有一个 Polygon 对象,它由存储在列表中的 N 个顶点组成。我已经抽象出一个函数rand_xy(),它生成一个随机点作为顶点,我想创建具有N个随机顶点的Polygon对象。

我试过了:

vertices = [ rand_xy() ] * N

但它列出了 N 个完全相同的顶点。我想这是有道理的,因为对 rand_xy() 的调用首先被评估,然后被复制 N 次。

我希望它通过调用rand_xy() N 次来代替它。有没有办法做到这一点(最好是一行)?

我意识到“显而易见”的方法就是这样做:

vertices = []
for i in range( 0 , N ):
    vertices.append( rand_xy() )

但我的 Polygon 构造函数是

def __init__( self , vertices , color )

如果我可以将vertices 的默认值设置为像这样的 N 个点的随机列表,我会非常喜欢:

def __init__( self , vertices = [ rand_xy() ] * N , color = rand_rgb() )

这样,调用不带参数的Polygon 构造函数会给我一个随机的新Polygon。或者对于构造函数有更好的设计选择吗?或者这不能在 Python 中完成?

感谢您的帮助!

【问题讨论】:

    标签: python list python-2.7


    【解决方案1】:

    是的,正如您所观察到的,当您这样做时 - [ rand_xy() ] * N - 首先评估函数调用,然后将结果放入列表中,然后相乘以创建 N 元素列表(尽管所有相同的项目) .

    你可以做列表理解而不是[ rand_xy() ] * N -

    vertices = [rand_xy() for _ in range(N)]
    

    这可以在一行中完成。


    但请注意,您不应将此或任何列表用作默认参数。我猜你什么时候说你需要做 -

    def __init__( self , vertices = [ rand_xy() ] * N , color = rand_rgb() )
    

    这意味着您正在尝试将其用作默认参数。但请注意,默认参数只计算一次,当函数被定义时,它不会在每次调用函数时不计算参数。检查问题 - "Least Astonishment" and the Mutable Default Argument - 了解更多详情。

    您可以使用None 或其他方法,然后在函数体内创建默认值(如果值为None)。示例 -

    def __init__( self , vertices = None , color = rand_rgb() )
        if vertices is None:
            vertices = [rand_xy() for _ in range(N)]
    

    您可以对 color 执行相同的操作,如果您希望它在每次调用不带参数的函数时返回不同的随机 rgb 值。

    【讨论】:

      【解决方案2】:

      要将顶点初始化为默认随机值,您可以这样做:

      def __init__( self , vertices = None , color = rand_rgb() ):
          self.vertices = [rand_xy() for _ in range(N)] if vertices is None else vertices
      

      将默认值分配给列表或其他可变结构并不是一个好主意。

      【讨论】:

        猜你喜欢
        • 2017-07-07
        • 2012-11-12
        • 1970-01-01
        • 2018-09-21
        • 2017-05-07
        • 2018-08-11
        • 1970-01-01
        • 1970-01-01
        • 2020-02-09
        相关资源
        最近更新 更多