Damian Brunold
Python Fallstrick mit Default-Werten
2011-12-07 16:11
Heute lief ich in eine Falle, die ich eigentlich schon kannte. Bei diesem Beispielcode:
>>> X = 12 >>> class Test(object): ... def __init__(self, x=X): ... self.x = x ... >>> X = 13 >>> X 13 >>> t = Test() >>> t.x 12
dachte ich, dass die letzte Zeile 13 sein sollte. Schliesslich wird Test erst instanziiert, wenn X schon 13 ist. Das spielt aber keine Rolle, weil die Default-Werte zum Zeitpunkt der Klassendefinition evaluiert werden.
Wobei es nicht eine vollständige Evaluation ist, wohl eher das Speichern des (lexikalischen) Frames, sodass das Binding fixiert ist. Denn der folgende Code:
>>> X = [12] >>> class Test(object): ... def __init__(self, x=X[0]): ... self.x = x ... >>> X[0] = 12 >>> X [12] >>> t = Test() >>> t.x 12 >>> X = [11] >>> X [11] >>> t = Test() >>> t.x 12
zeigt, dass es funktioniert, solange man das Binding von X selber nicht ändert. X[0] wird aber durchaus zum Instanziierungszeitpunkt evaluiert.