ho provato il seguente codice in Python 3.5.1:comprensione dizionario con funzioni lambda dà risultati errati
>>> f = {x: (lambda y: x) for x in range(10)}
>>> f[5](3)
9
E 'ovvio che questo dovrebbe tornare 5
. Non capisco da dove provenga l'altro valore e non sono riuscito a trovare nulla.
Sembra che si tratti di un riferimento al riferimento - restituisce sempre la risposta di f[9]
, che è l'ultima funzione assegnata.
Qual è l'errore qui, e come dovrebbe essere fatto in modo che funzioni correttamente?
Una scorciatoia alternativa sarebbe 'f = {x: (lambda y, x = x: x) per x nella gamma (10)}', perché argomenti di default sono vincolati al momento definizione, così legherebbero il _valore_ di 'x', non il _name_' x'. – ShadowRanger
Questa può sembrare una domanda molto stupida (non ho familiarità con lambda), ma come funziona make_func (x)? Posso immaginare che f [5] (3) significa -> f = {5: make_func (5)}. Allora, come è che make_func (5) (3) è uguale a 5? – Adib
La comprensione del dizionario rende le chiavi del dizionario degli interi ai valori delle funzioni. f [5] restituisce il valore nel dizionario digitato per 5, che risulta essere la funzione lambda y: x. Nota che lambda ignora ciò che è passato in (y) e restituisce sempre x. Questo è il motivo per cui il lambda restituirà 5 o 9 (a causa del problema descritto sopra). – gnicholas