Damian Brunold

Python Fallstrick mit Default-Werten

2011-12-07 16:11 Programmieren, Python

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.