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