chciałem mieć listę lambdas które działają jako rodzaj pamięci podręcznej do niektórych ciężkich obliczeń i zauważyłem to:lambdas lista wewnątrz Ułatwienia
>>> [j() for j in [lambda:i for i in range(10)]]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
Chociaż
>>> 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>]
ten sposób, że lambdas są unikalne funkcje, ale w jakiś sposób wszystkie mają tę samą wartość indeksu.
Czy to błąd lub funkcja? Jak mogę uniknąć tego problemu? To nie jest ograniczone do listowych ...
>>> 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]
Pierwsze podejście nie działa tak dobrze, gdy chcesz, aby 'lambda' obsługiwała' * args'. Drugie podejście będzie tam działać, ale jest ... więcej pracy :) –
Szkoda, nie mogę dać zielonego znaku dla obu odpowiedzi. Wybrałem ten, ponieważ podał poprawny kod do wycinania i wklejania, tak jakbym miał pięć lat i podoba mi się to podejście do odpowiedzi na SO. – ubershmekel
Dla tych z nas mniej dobrych w Pythonie, czy jest szansa, że użyjesz innej zmiennej niż 'i' dla jednej z instancji w pierwszym podejściu? – Chowlett