Список понимания и функций - PullRequest
1 голос
/ 14 февраля 2010

Я немного сбиваю с толку, когда пытаюсь что-то подобное

b = [lambda x:x**i for i in range(11)]

Когда я тогда пытаюсь b[1](2), в результате получается 1024, что неверно. Но когда я пишу так

b = [(lambda i: lambda x:x**i)(i) for i in range(11)]

все в порядке

>>> b[1](2)
2
>>> b[5](2)
32

Работает нормально, но что не так в первом коде?

Ответы [ 2 ]

3 голосов
/ 14 февраля 2010

Это связано с , как работают замыкания в Python .

Цикл изменяет значение в области действия, которое все разделяют функции.Переместите генерацию функции в отдельную область видимости, т.е. функцию.

1 голос
/ 14 февраля 2010

Это игра в прицел.

В первом коде имя «i» в лямбде является только ссылкой. Значение этой ссылки изменяется при выполнении цикла for.

Во втором коде есть две разные области действия.

...