Я встречаюсь с каким-то странным поведением с лямбда-функциями в цикле в python. Когда я пытаюсь назначить лямбда-функции в словарных записях в списке, а когда другие слова в словаре используются в этой функции, только последний раз через цикл вычисляется лямбда-оператор. Таким образом, все функции имеют одинаковое значение!лямбда-операторов в петлях питона
Ниже приведен урезанный код, который захватывает только те части, что я пытаюсь, что ведет себя странно. Мой фактический код более сложный, не такой тривиальный, как этот, поэтому я ищу объяснение и, желательно, обходное решение.
n=4
numbers=range(n)
entries = [dict() for x in numbers]
for number, entry in zip(numbers,entries):
n = number
entry["number"] = n
entry["number2"] = lambda x: n*1
for number in numbers:
print(entries[number]["number"], entries[number]["number2"](2))
Выход:
0 3
1 3
2 3
3 3
Другими словами, словарь заходы, которые только целые числа в порядке, и были заполнены должным образом с помощью петли. Но функции лямбда - тривиальные и должны просто возвращать то же значение, что и записи «число» - это все, установленные до последнего прохода.
Что происходит?
хороший ответ, хотя я бы удалил комментарий: «# Необязательно: del lim, если это будет необходимо позже». Я не вижу необходимости развязывать ссылку «lim» из глобального пространства имен. За исключением некоторых случайных случаев, 'del' обычно считается плохим стилем и не используется. Для такого тривиального сценария отключение единственной ссылки на целое было бы нетрадиционным и беспристрастным. –
Не собираюсь притворяться, что ничего не знаешь о соглашениях на высшем уровне питона. большинство моих знаний на питоне - это любитель. Благодарю. – BHustus