F>def a():
F> x = 2
F> def b():
F> z = x
F># x = 3
F> print x
F> b()
F>a()
F>
F>если откомментить x = 3, то будет ошибка на предыдущей строке, что x ещё не объявлена..
F>я правильно понимаю, что оно всё-таки выполняется не построчно?.
Выполняется-то построчно. Но выполнение происходит после формирования списка локальных имён в функциях, если я не ошибаюсь, на этапе парсинга. Сначала в функции ищутся все присваивания и эти имена помещаются в список локальных имён этой функции.
Здравствуйте, Temoto, Вы писали:
T>Выполняется-то построчно. Но выполнение происходит после формирования списка локальных имён в функциях, если я не ошибаюсь, на этапе парсинга. Сначала в функции ищутся все присваивания и эти имена помещаются в список локальных имён этой функции. T>Ох уж этот грёбаный питон. :|
в 3м появился квалификатор nonlocal, он разруливает..
замыкание в python-е>>если откомментить x = 3, то будет ошибка на предыдущей строке, что x ещё не объявлена.. >>я правильно понимаю, что оно всё-таки выполняется не построчно?.
А какой версией питона вы пользуетесь? в 2.6 с закоментированным x = 3 все работает и выдает праивльный результат 2. Если же расскоментировать строчку с x = 3, то переменная x появляеться в локальной области видимости и интерпретатор вам соверешенно верно выдает ошибку что преременная не определена (строка z = x)
Здравствуйте, meandr, Вы писали:
M>переменная x появляеться в локальной области видимости и интерпретатор вам соверешенно верно выдает ошибку что преременная не определена (строка z = x)
интересно, с чего бы это "совершенно верно" ?.
замыкания с возможностью записи в переменную невозможны?.
F>def a():
F> x = 2
F> def b():
F> z = x
F># x = 3
F> print x
F> b()
F>a()
F>
F>если откомментить x = 3, то будет ошибка на предыдущей строке, что x ещё не объявлена.. F>я правильно понимаю, что оно всё-таки выполняется не построчно?.
Для сокращения записи (переменные не нужно объявлять) переменные, которым присваивают значение, считаются локальными (логично, ведь всем переменным перед получением значения его присваивают), а если присваивания нет — внешними. Локальность определяется статически, достаточно присваивания в любой части кода, даже в недостижимой (идиомой является if 0: x = 0). Это сделано, чтобы уберечь от труднодиагностируемых ошибок, когда имя в одной части функции ссылается на одну переменную, а в другой — на другую.
Переменную можно явно объявить нелокальной при помощи ключевого слова global (только для глобальных), а с недавних пор — и nonlocal.
Re[2]: замыкание в python-е>>замыкания с возможностью записи в переменную невозможны?.
В том смысле что переменная становиться локальной для данной области видимости (так уж работает компилятор байткода), хотя вы сами уже сказали что в 3 версии есть модификатор nonlocal