Frage

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]

Ich würde erwarten, dass die argspec für Test.Test nicht, aber es tut, weil der dict.update zu ändern. Warum?

War es hilfreich?

Lösung

Da dicts sind veränderbare Objekte. Wenn Sie d.update(p) nennen, mutieren Sie tatsächlich die Standardinstanz des dict. Dies ist ein häufiges Problem; Insbesondere sollten Sie nie ein veränderbares Objekt als Standardwert in der Liste der Argumente verwenden.

Eine bessere Möglichkeit, dies zu tun, ist wie folgt:

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

Andere Tipps

Ein Standardargument in Python wird jedes Objekt gesetzt wurde, wenn die Funktion definiert wurde, auch wenn Sie ein veränderbares Objekt gesetzt. Diese Frage sollte erklären, was das bedeutet und warum Python ist die Frage SO dest Erstaunen in python. das veränderbare Standardargument

Im Grunde genommen das gleiche Standardobjekt wird jedes Mal die Funktion aufgerufen wird, anstatt eine neue Kopie Wesen verwendet, um jedes Mal gemacht. Zum Beispiel:

>>> def f(xs=[]):
...   xs.append(5)
...   print xs
... 
>>> f()
[5]
>>> f()
[5, 5]

Der einfachste Weg, um dies ist Ihr tatsächliches Standardargument None zu machen, und dann einfach für None zu überprüfen und eine Standard in der Funktion, zum Beispiel bieten:

>>> def f(xs=None):
...   if xs is None:
...     xs = []
...   xs.append(5)
...   print xs
... 
>>> f()
[5]
>>> f()
[5]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top