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

时间:2010-04-28 13:59:53

标签: 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]

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

2 个答案:

答案 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]