列出Python函数定义中的构建

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?

Mar*_*ers 6

你无法做你想做的事,因为函数默认值是在创建函数时执行,而不是在调用函数时执行.

函数中创建列表:

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)