题
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]
我希望argspec进行测试。测试不改变,而是因为dict.uptate的做法。为什么?
解决方案
因为柱子是可变的物体。你打电话时 d.update(p)
, ,您实际上正在突变dict的默认实例。这是一个普遍的捕获;特别是,你应该 绝不 在参数列表中使用可变对象作为默认值。
更好的方法是如下:
class Test:
def test(self, p, d = None):
if d is None:
d = {}
d.update(p)
return d
其他提示
python中的默认参数是定义函数时设置的任何对象,即使您设置了可变的对象。这个问题应该解释这意味着什么以及为什么python是这样的问题 Python中的最少惊讶:可变的默认论点.
基本上,每次调用函数时都会使用相同的默认对象,而不是每次都会制作新副本。例如:
>>> 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]
不隶属于 StackOverflow