在 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
...
我想构建一个这样的原型:
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
...