Freitag, 23. Januar 2009

Seiteneffekte in Python

Im Moment bin ich auf Amrum, draußen liegt Schnee und ich programmiere in Python. Ich habe gerade lange einen Bug in meinem Code gesucht, der sich aus für mich überraschenden Seiteneffekten in Python ergab. Folgendes Skript demonstriert das:

n = 10

l = range(0, n)

lazyList = []
for i in range(0, n):
lazyList.append((lambda x: x[i], l))

resultList = []
for (fun, x) in lazyList:
resultList.append(fun(x))

print(resultList)


Das Ergebnis ist wider Erwarten:

[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
Die mit lambda erstellten Funktionen verändern also ihr verhalten, weil sie anscheinend auf i referenzieren und nicht den Wert abspeichern. Ist das gewollt? Oder ein Bug im Python-Interpreter? In beiden Fällen, wie kann man das umgehen?

2 Kommentare:

Anonym hat gesagt…

Glaube, das soll so. Vielleicht so umgehen?

from functools import partial
for i in range(0, n):
lazyList.append(partial(list.__getitem__, l, i))

Nico

Anonym hat gesagt…

Hier geht es um das selbe Problem.

Workaround ist

lazyList.append((lambda x, i=i: x[i], l))