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]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top