我想建立一个原型:
def foo(a,t=([0]*len(a))):
print t
目前不重要的原因。我传入的是可变长度列表参数。但是,Linux上的Python 2.7.10总是返回如下:
>>> a = [1,2,3,4]
>>> foo(a)
[O, 0]
没有函数调用,这些都不会以意外的方式运行。是什么导致Python始终认为在foo()中的变量赋值期间传递的列表是长度为2?
答案 0 :(得分:6)
你不能做你想做的事,因为函数默认值是在创建函数时执行的,而不是在调用函数时执行。
在函数中创建列表:
def foo(a, t=None):
if t is None:
t = [0] * len(a)
print t
None
在这里是一个有用的哨兵;如果t
设置为None
,则表示没有为其指定任何值,因此您需要创建新列表以替换它。这也巧妙地避免了将mutable存储为默认值(参见"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
...