In Python, le chiusure sono variabili, non in base al valore. Pertanto, quando si fa riferimento a x
in una funzione, fa riferimento al valore più recente assegnato a x
, non al valore di x
quando la funzione è stata definita. Questo ottiene risultati non intuitivi come quello qui sotto:
adders = []
for x in range(10):
adders.append(lambda y: x+y)
avete intenzione di fare un elenco di funzioni che aggiungono x
ad un valore, dove x
varia da 0 ... 9, ma invece hanno tutti aggiungere 9 perché questo è il valore di x
alla fine del ciclo.
È possibile eseguire l'override utilizzando un argomento predefinito per associare il nome al relativo valore al momento della definizione della funzione.
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 questo esempio non sei nemmeno in realtà si tratta di una chiusura: x
qui è in realtà una variabile globale. In Python, una chiusura può essere creata solo quando una funzione è definita all'interno di un'altra funzione e lo spazio dei nomi principale o globale non è una funzione. Ma vale lo stesso principio: la variabile globale può ovviamente essere cambiata dopo che la funzione è stata definita, quindi se si desidera "bloccare" il suo valore al momento della definizione della funzione, si utilizza un argomento predefinito.
Bene, si potrebbe anche dire che in ML, le variabili sono anche catturate per riferimento - le variabili non possono essere assegnate in ML, quindi se le variabili sono catturate dal valore o dal riferimento non fa differenza. – newacct
Sì, non ne so abbastanza di ML per dire qualcosa al riguardo. :-) – kindall