4
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 により変更されます。なんで?

4

2 に答える 2

5

dict は変更可能なオブジェクトであるためです。を呼び出すとd.update(p)、実際には dict のデフォルト インスタンスが変更されます。これはよくある問題です。特に、可変オブジェクトを引数リストのデフォルト値として使用しないでください。

これを行うより良い方法は次のとおりです。

class Test:
    def test(self, p, d = None):
        if d is None:
            d = {}
        d.update(p)
        return d
于 2010-04-28T14:05:13.717 に答える
2

Python のデフォルトの引数は、変更可能なオブジェクトを設定した場合でも、関数が定義されたときに設定されたオブジェクトです。この質問は、それが何を意味するのか、なぜPythonが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]
于 2010-04-28T14:06:18.107 に答える