In Python sind Schließungen durch Variable, nicht durch Wert. Wenn Sie also in einer Funktion auf x
verweisen, bezieht sich das auf den letzten Wert, der x
zugewiesen wurde, nicht auf den Wert x
, als die Funktion definiert wurde. Dies wird nicht-intuitive Ergebnisse wie die unten:
adders = []
for x in range(10):
adders.append(lambda y: x+y)
Sie beabsichtigen, eine Liste von Funktionen zu machen, die x
auf einen Wert hinzufügen, wo x
von 0 variiert ... 9, sondern sie alle in 9, weil das ist der Wert von x
am Ende der Schleife.
Sie können dies überschreiben, indem Sie ein Standardargument verwenden, um den Namen zum Zeitpunkt der Funktionsdefinition an seinen Wert zu binden.
x = 1
f = lambda y, x=x: x + y # x inside f is now locked at 1
x = 2
y = 3
z = f(x + y)
In diesem Beispiel sind Sie nicht einmal tatsächlich mit einem Verschluss zu tun: x
hier ist eigentlich eine globale Variable. In Python kann eine Closure nur dann erstellt werden, wenn eine Funktion in einer anderen Funktion definiert ist und der globale Namespace auf oberster Ebene oder Modul keine Funktion ist. Aber es gilt das gleiche Prinzip: Die globale Variable kann natürlich geändert werden, nachdem die Funktion definiert wurde. Wenn Sie also ihren Wert zum Zeitpunkt der Funktionsdefinition "sperren" wollen, verwenden Sie ein Standardargument.
Nun, Sie könnten auch sagen, dass in ML Variablen auch durch Referenz erfasst werden - Variablen können nicht in ML zugewiesen werden, also ob Variablen durch Wert oder durch Referenz erfasst werden, macht keinen Unterschied. – newacct
Ja, ich weiß nicht genug über ML, um etwas darüber zu sagen. :-) – kindall