Чтобы добавить ясности (по крайней мере, на мой взгляд)
def makeFun(i): return lambda: i
a = [makeFun(i) for i in range(10)]
b = [lambda: i for i in range(10)]
a использует makeFun (i), который является функцией с аргументом.
b использует лямбду: i, которая является функцией без аргументов. I, который он использует, сильно отличается от предыдущего
Чтобы сделать a и b равными, мы можем сделать обе функции без аргументов:
def makeFun(): return lambda: i
a = [makeFun() for i in range(10)]
b = [lambda: i for i in range(10)]
Теперь обе функции используют глобальный i
.
>>> a[2]()
9
>>> b[2]()
9
>>> i=13
>>> a[2]()
13
>>> b[2]()
13
Или (более полезно) заставить оба использовать один аргумент:
def makeFun(x): return lambda: x
a = [makeFun(i) for i in range(10)]
b = [lambda x=i: x for i in range(10)]
Я намеренно изменил i на x, где переменная является локальной.
Сейчас:
>>> a[2]()
2
>>> b[2]()
2
Удачи!