dict.update会影响函数的argspec吗?

Rus*_*ell 4 python inspect

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]
Run Code Online (Sandbox Code Playgroud)

我希望Test.test的argspec不会改变,但是因为dict.update它会改变.为什么?

Tam*_*más 5

因为dicts是可变对象.当你打电话时d.update(p),你实际上正在改变dict的默认实例.这是一个常见的问题; 特别是,你应该从来没有使用可变对象作为参数列表中的默认值.

更好的方法是:

class Test:
    def test(self, p, d = None):
        if d is None:
            d = {}
        d.update(p)
        return d
Run Code Online (Sandbox Code Playgroud)