volevo avere un elenco di lambda che agiscono come una sorta di cache per alcuni calcoli complessi e notato questo:lambda elenco all'interno comprehensions
>>> [j() for j in [lambda:i for i in range(10)]]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
Sebbene
>>> list([lambda:i for i in range(10)])
[<function <lambda> at 0xb6f9d1ec>, <function <lambda> at 0xb6f9d22c>, <function <lambda> at 0xb6f9d26c>, <function <lambda> at 0xb6f9d2ac>, <function <lambda> at 0xb6f9d2ec>, <function <lambda> at 0xb6f9d32c>, <function <lambda> at 0xb6f9d36c>, <function <lambda> at 0xb6f9d3ac>, <function <lambda> at 0xb6f9d3ec>, <function <lambda> at 0xb6f9d42c>]
senso che le lambda sono funzioni uniche ma in qualche modo condividono tutti lo stesso valore di indice.
È un bug o una funzionalità? Come evito questo problema? Non è limitato a list comprehension ...
>>> funcs = []
... for i in range(10):
... funcs.append(lambda:i)
... [j() for j in funcs]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
Il primo approccio non funziona così bene quando vuoi che 'lambda' supporti' * args'. Il secondo approccio funzionerà lì, ma è ... più lavoro :) –
Peccato che non possa dare il segno verde a entrambe le risposte. Ho scelto questo perché in realtà ha dato il codice corretto per tagliare e incollare come se avessi cinque anni e mi piace quell'approccio alle risposte su SO. – ubershmekel
Per quelli di noi meno bravi in Python, c'è qualche possibilità di usare una variabile diversa da 'i' per una delle istanze nel primo approccio? – Chowlett