lambda - Besonderheit

15/05/2008 - 20:27 von Karsten W. | Report spam
Hallo,

kann mir jemand erklàren warum die lambda-Konstruktion unten "ccc"
ausgibt und nicht wie erwartet "abc". Gibt es eine Möglichkeit, die
Hilfsklasse zu umgehen?

Freundliche Grüße,
Karsten.

import sys

l = list("abc")
fl1 = []
fl2 = []

class writer:
def __init__(self, what):
self._what = what
def __call__(self):
sys.stdout.write(self._what)

for c in l:
fl1.append(lambda : sys.stdout.write(c))
fl2.append(writer(c))

for f in fl1:
f()



ccc







for f in fl2:
f()



abc
 

Lesen sie die antworten

#1 Diez B. Roggisch
15/05/2008 - 20:34 | Warnen spam
Karsten W. schrieb:
Hallo,

kann mir jemand erklàren warum die lambda-Konstruktion unten "ccc"
ausgibt und nicht wie erwartet "abc". Gibt es eine Möglichkeit, die
Hilfsklasse zu umgehen?

Freundliche Grüße,
Karsten.

import sys

l = list("abc")
fl1 = []
fl2 = []

class writer:
def __init__(self, what):
self._what = what
def __call__(self):
sys.stdout.write(self._what)

for c in l:
fl1.append(lambda : sys.stdout.write(c))
fl2.append(writer(c))

for f in fl1:
f()
ccc







for f in fl2:
f()
abc









weil closures so in python nicht funktionieren. Die umgebenden variablen
werden nur per name gebunden, nicht per wert. Erst wenn die Funktion
ausgewertet wird, wird der Name aufgeloest.

Wenn du stattdessen

lambda c=c: ...

machst, dann bindest du c im moment der erzeugung des lambdas.

Diez

Ähnliche fragen