import inspect
class Test:
def test(self, p, d={}):
d.update(p)
return d
print inspect.getargspec(getattr(Test, 'test'))[3]
print Test().test({'1':True})
print inspect.getargspec(getattr(Test, 'test'))[3]
我希望Test.test的argspec不会改变,但是因为dict.update它会改变。为什么呢?
答案 0 :(得分:5)
因为dicts是可变对象。当你调用d.update(p)
时,你实际上正在改变dict的默认实例。这是一个常见的问题;特别是,您应该永远使用可变对象作为参数列表中的默认值。
更好的方法如下:
class Test:
def test(self, p, d = None):
if d is None:
d = {}
d.update(p)
return d
答案 1 :(得分:2)
Python中的默认参数是定义函数时设置的任何对象,即使您设置了一个可变对象。这个问题应该解释这意味着什么以及为什么Python是SO问题least astonishment in python: the mutable default argument。
基本上,每次调用函数时都使用相同的默认对象,而不是每次都创建一个新的副本。例如:
>>> def f(xs=[]):
... xs.append(5)
... print xs
...
>>> f()
[5]
>>> f()
[5, 5]
最简单的方法是制作实际的默认参数None
,然后只需检查None
并在函数中提供默认值,例如:
>>> def f(xs=None):
... if xs is None:
... xs = []
... xs.append(5)
... print xs
...
>>> f()
[5]
>>> f()
[5]