在 Python 函数定义中列出构建

List building in Python function definition

我想构建一个这样的原型:

def foo(a,t=([0]*len(a))):
  print t

出于目前不重要的原因。我将可变长度列表参数传递给 .然而,Python 2.7.10 在 Linux 上总是 returns 如下:

>>> a = [1,2,3,4]
>>> foo(a)
[O, 0]

如果没有函数调用,none 将以意外方式运行。发生了什么导致 Python 在 foo() 中的变量赋值期间始终认为传递的列表长度为 2?

您不能随心所欲,因为函数默认值是在函数创建时执行的,而不是在函数被调用时执行的。

在函数中创建列表

def foo(a, t=None):
    if t is None:
        t = [0] * len(a)
    print t

None 是一个有用的哨兵;如果 t 保留设置为 None 你知道没有为它指定值,所以你创建新列表来替换它。这也巧妙地避免了将可变对象存储为默认值(参见 "Least Astonishment" and the Mutable Default Argument 为什么这可能不是一个好主意)。

您的示例只有在您已经预先定义 a 的情况下才能工作:

>>> def foo(a,t=([0]*len(a))):
...   print t
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> a = [1, 2]
>>> def foo(a,t=([0]*len(a))):
...   print t
...