Ваше значение i изменилось, и это не то, что вы думаете.
Сначала вы создаете лямбду:
j = lambda x: x + i
в надежде, что я останусь как текущее значение (т. Е. 0, 1, 2 и т. Д.).
Тогда вы выполните это:
print(i(1))
Видите ли, как вы назвали свою вторую переменную итератора i ? Измените его на j , и ваш пример будет работать. Зачем? Поскольку python разрешает значение i в вашей лямбде, когда вы ее выполняете, а не когда вы ее определяете. Поэтому, когда вы выполните свою лямбду ( i (1) ), она перейдет к вашему лямбда-телу и попробует x + i . Тогда он будет искать i , который теперь содержит вашу лямбду (не INTEGER!). Отсюда твоя проблема.
Вам нужно сделать двойную функцию, чтобы она работала правильно. Попробуйте это:
if __name__ == "__main__":
nums = []
for i in range(10):
def generate_lambda(i):
return lambda x: x + i
j = generate_lambda(i)
nums.append(j)
for i in nums:
print(i(1))
Почему это работает? Когда вы вызываете generate_lambda , будет i переменная с вашим значением INTEGER. Это будет теневая переменная i , используемая позже для перебора лямбд. А поскольку вы никогда не изменяете переменную i внутри функции generate_lambda , она останется такой всегда.