замыкание в python-е
От: neFormal Россия  
Дата: 22.03.11 09:25
Оценка:
def a():
    x = 2
    def b():
        z = x
#        x = 3
        print x
    b()
a()

если откомментить x = 3, то будет ошибка на предыдущей строке, что x ещё не объявлена..

я правильно понимаю, что оно всё-таки выполняется не построчно?.
...coding for chaos...
python
Re: замыкание в python-е
От: Temoto  
Дата: 22.03.11 09:41
Оценка:
Здравствуйте, neFormal, Вы писали:

F>
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>я правильно понимаю, что оно всё-таки выполняется не построчно?.


Выполняется-то построчно. Но выполнение происходит после формирования списка локальных имён в функциях, если я не ошибаюсь, на этапе парсинга. Сначала в функции ищутся все присваивания и эти имена помещаются в список локальных имён этой функции.

Ох уж этот грёбаный питон. :|
Re[2]: замыкание в python-е
От: neFormal Россия  
Дата: 22.03.11 10:06
Оценка:
Здравствуйте, Temoto, Вы писали:

T>Выполняется-то построчно. Но выполнение происходит после формирования списка локальных имён в функциях, если я не ошибаюсь, на этапе парсинга. Сначала в функции ищутся все присваивания и эти имена помещаются в список локальных имён этой функции.

T>Ох уж этот грёбаный питон. :|

в 3м появился квалификатор nonlocal, он разруливает..
...coding for chaos...
Re: замыкание в python-е
От: meandr  
Дата: 22.03.11 10:08
Оценка:
замыкание в python-е>>если откомментить x = 3, то будет ошибка на предыдущей строке, что x ещё не объявлена..
>>я правильно понимаю, что оно всё-таки выполняется не построчно?.

А какой версией питона вы пользуетесь? в 2.6 с закоментированным x = 3 все работает и выдает праивльный результат 2. Если же расскоментировать строчку с x = 3, то переменная x появляеться в локальной области видимости и интерпретатор вам соверешенно верно выдает ошибку что преременная не определена (строка z = x)
Posted via RSDN NNTP Server 2.1 beta
Re[2]: замыкание в python-е
От: neFormal Россия  
Дата: 22.03.11 10:44
Оценка:
Здравствуйте, meandr, Вы писали:

M>переменная x появляеться в локальной области видимости и интерпретатор вам соверешенно верно выдает ошибку что преременная не определена (строка z = x)


интересно, с чего бы это "совершенно верно" ?.
замыкания с возможностью записи в переменную невозможны?.
...coding for chaos...
Re: замыкание в python-е
От: gegMOPO4  
Дата: 22.03.11 12:16
Оценка:
Здравствуйте, neFormal, Вы писали:
F>
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[3]: замыкание в python-е
От: meandr  
Дата: 22.03.11 12:22
Оценка:
Re[2]: замыкание в python-е>>замыкания с возможностью записи в переменную невозможны?.

В том смысле что переменная становиться локальной для данной области видимости (так уж работает компилятор байткода), хотя вы сами уже сказали что в 3 версии есть модификатор nonlocal
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.