Исправление tailgunner, (текущая версия) :
если замыкание захватывает переменную, локальную для итерации цикла (т.е. локальную для цикла и изменяющуюся в следующей итерации), то эта переменная в замыкание копируется
это немного необычная для людей семантика
...в которой куски кода:
l, i = 0, []
for i in range(2):
l.append(lambda: i)
l = []
for i in range(2):
l.append(lambda: i)
имеют разную семантику. Зашибись.
нелокальный скоуп — это часть питоновского бардака
Бардак - он, как обычно, в головах. В примере ТС нет никакого «нелокального скоупа».
Исходная версия tailgunner, :
если замыкание захватывает переменную, локальную для итерации цикла (т.е. локальную для цикла и изменяющуюся в следующей итерации), то эта переменная в замыкание копируется
это немного необычная для людей семантика
...в которой куски кода:
l, i = 0, []
for i in range(2):
l.append(lambda: i)
l = []
for i in range(2):
l.append(lambda: i)
имеют разную семантику. Зашибись.