Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция exec() и область видимости 
:(
    Опции темы
MAKCim
Дата 13.2.2010, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 1
Всего: 207



вопрос чисто из спортивного интереса
1)
Код

l = {}
g = {}

exec("n = 1\ndef f(v):\n\tn = v\nf(n + 1)", g, l)

2)
Код

l = {}
g = {}

exec("n = 1\ndef f(v):\n\t\global n\n\tn = v\nf(n + 1)", g, l)

почему в первом случае n окажется в l, а во-втором - в g?

я готов принять факт того, что global, примененный в контексте exec, связывает имя с g, но тогда почему во-втором случае, n определяется только в g, а не в l и g?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
MAKCim
Дата 14.2.2010, 11:11 (ссылка) |  (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 1
Всего: 207



up


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
spSerg
Дата 15.2.2010, 13:00 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.3.2007

Репутация: 4
Всего: 4



Давай представим код в нормальном виде:
Код

n = 1
def f(v):
    n = v
f(n + 1)

Код

n = 1
def f(v):
    global n
    n = v
f(n + 1)

если попробовать реально код выполнить (не через exec, а напрямую), то ведь не возникает вопрос, почему n во втором случае меняется только глобальная, а не создается еще и ее локальная копия?

PM   Вверх
MAKCim
Дата 17.2.2010, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 1
Всего: 207



spSerg, 
вы меня не поняли
в первом случае n попадает в l
global связывает имя с объектом в глобальной области
если в первом случае n попадает в l, значит в контексте exec() l - глобальная область
если global в контексте exec связывает имя с объектом в g, то почему n отсутствует в l во втором случае?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
spSerg
Дата 18.2.2010, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 22.3.2007

Репутация: 4
Всего: 4



и в самом деле, не так понял.  smile 
Даже самому стало интересно.
Более того:
Код

>>> l, g = {},{}
>>> exec("""n = 1
loc0=dir()
def f(v):
    global n
    n = v
    loc1=dir()
f(n + 1)
loc2=dir()
n = 5
loc3=dir()""", g, l)
>>> l
{'loc2': ['f', 'loc0'], 'loc3': ['f', 'loc0', 'loc2'], 'loc0': [], 'f': <function f at 0x03227930>}
>>> g['n']
5
 
Получается, что global срабатывает на весь фрагмент выполняемого кода. Независимо от его местоположения. smile 
Похоже на баг? smile


PM   Вверх
MAKCim
Дата 21.2.2010, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 1
Всего: 207



вот и я про то же  smile 
попробую обратиться в вышестоящую инстанцию


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0511 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.