Als Antwort auf den Artikel von @buchio Python Lambda ist nutzlos ^ H ^ H ^ H ^ H ^ H schwer zu verwenden schauen.
Es ist leicht, die lokale Variable zu verstehen, wenn Sie glauben, dass der Bereich dahinter reserviert ist. Die Referenz im Lambda ist die Fläche, nicht der Wert der Variablen (sichtbar zum Zeitpunkt der Definition). Mit anderen Worten, test1 im Originalartikel entspricht dem folgenden Code.
>>> def test1_aux():
... env = [None]
... funcs = []
... for i in range(10):
... env[0] = i
... funcs.append(lambda a: a+env[0])
... return funcs
...
>>> print [f(10) for f in test1_aux()]
[19, 19, 19, 19, 19, 19, 19, 19, 19, 19]
Die Tatsache, dass der Umfang der Variablen i nicht auf das Innere der for-Anweisung beschränkt ist, ist sicherlich etwas verwirrend, aber ich denke nicht, dass daran etwas Seltsames ist.
Übrigens können für die Listeneinschlussnotation, die eng mit der for-Anweisung verwandt ist, Variablen aus dem äußeren Bereich von Python 3 nicht mehr referenziert werden.
python2
>>> [x for x in range(3)]
[0, 1, 2]
>>> x
2
python3
>>> [x for x in range(3)]
[0, 1, 2]
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
In Python können Sie es aufrufen, indem Sie die Methode \ _ \ _ call \ _ \ _ in einer beliebigen Klasse implementieren. So können Sie das Objekt dort verwenden, wo Sie den Verschluss benötigen.
>>> class Adder(object):
... def __init__(self, i):
... self.i = i
... def __call__(self, a):
... return a + self.i
...
>>> def test_callable():
... funcs = []
... for i in range(10):
... funcs.append(Adder(i))
... return funcs
...
>>> print [f(10) for f in test_callable()]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
In Python ist die Verwendung von Funktionen und Objekten besser lesbar und einfacher. Daher ist es besser, Lambdas für andere Zwecke als für einfache Ausdrücke zu verwenden.
Recommended Posts