Рассмотрим следующий фрагмент кода:Список и генератор постижений с классом variabes в условном операторе
class C(object):
a = 0
b = 1
seq = [1, 2, 4, 16, 17]
list_comp = [a if v%2 else b for v in seq]
gen_comp = (a if v%2 else b for v in seq)
Код выше истолковано хорошо. Объект печати привязан к переменным класса приводит:
print C.list_comp # [0, 1, 1, 1, 0]
print C.gen_comp # <generator object <genexpr> at ...>
Sad часть - попытка получить значение из результатов генератора в NameError
:
next(C.gen_comp) # NameError: global name 'a' is not defined
Ожидаемое поведение должно быть похоже на список понимание - это должно дать 5 значения и поднять StopIteration
на каждый следующий next()
звонок.
Что здесь имеет значение? Как имена разрешаются в каждом случае и почему возникает несоответствие?
Разница заключается в том, что теперь у понятий списка есть своя область видимости в Python 3, аналогичная выражению генератора. Также поясняется здесь: https://docs.python.org/2/reference/executionmodel.html –