列出Python函数定义中的构建

时间:2015-09-10 20:56:54

标签: python python-2.7 kwargs function-declaration

我想建立一个原型:

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?

1 个答案:

答案 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
...