您需要了解的默认值,以便有效地使用它们是如何工作的。
功能是对象。因此,它们具有属性。所以,如果我创建这个功能:
>>> def f(x, y=[]):
y.append(x)
return y
我已经创建了一个对象。这里是它的属性:
>>> dir(f)
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__',
'__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__',
'__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals',
'func_name']
其中之一是func_defaults
。听起来很有希望,那里有什么?这是一个包含函数默认值的元组。如果默认值是一个对象,则该元组包含该对象的一个实例。
这会导致一些非常违反直觉的行为,如果你认为f
增加了一个项目列表,返回只包含项目的列表,如果没有提供列表:
>>> f(1)
[1]
>>> f(2)
[1, 2]
但是,如果你知道默认值是一个储存在该函数的属性之一的对象实例,它更是违反直觉:
>>> x = f(3)
>>> y = f(4)
>>> x == y
True
>>> x
[1, 2, 3, 4]
>>> x.append(5)
>>> f(6)
[1, 2, 3, 4, 5, 6]
认识到这一点,很明显,如果你想要一个函数的参数的默认值是一个新的列表(或任何新的ob ject),你不能简单地在func_defaults
中存储对象的一个实例。每次调用函数时都必须创建一个新的函数:
>>>def g(x, y=None):
if y==None:
y = []
y.append(x)
return y
如果解决了问题,您应该接受答案!几个答案似乎非常丰富。尽管这个问题还很陈旧,但我认为给出一个批准的答复是一个好主意 – eipxen 2011-11-29 18:31:45
[[Python中的“最小的惊讶”:可变的默认参数]可能的重复(http://stackoverflow.com/问题/ 1132941/python-the-mutable-default-argument中的令人惊讶的事情) – 2013-07-12 00:06:22