2014-02-04 2 views
4

Я поставил метод в файле mymodule.py:питона Глобалы: импорт по сравнению с ExecFile

def do_something(): 
    global a 
    a=1 

Если я пытаюсь

>>> execfile('mymodule.py') 
>>> do_something() 
>>> print a 

я получаю "1", как я ожидал. Но если я импортировать модуль вместо,

>>> from mymodule import * 

, а затем запустить do_something(), то питон сессия ничего не знает о переменной «а».

Может ли кто-нибудь объяснить мне разницу? Благодарю.

ответ

1

Во второй части, где вы импортируете mymodule, причина, по которой она не отображается, заключается в том, что a является глобальным для пространства имен mymodule, как это сделано таким образом.

Try:

print mymodule.a 

Это печатает:

1 

Как и следовало ожидать.

Согласно Python documentation:

Глобальное заявление является декларацией, которая имеет место в течение всего текущего блока кода. Это означает, что перечисленные идентификаторы должны быть интерпретированы как глобальные. Невозможно назначить глобальную переменную без глобальных, хотя свободные переменные могут ссылаться на глобальные значения , не объявляя глобальными.

Имена, перечисленные в глобальном выражении, не должны использоваться в том же коде , который текстурно предшествует этому глобальному утверждению.

Имена, перечисленные в глобальном выражении, не должны определяться как формальные параметры или в целевом элементе управления циклом, определении класса, определении функции или операции импорта.

+0

Вы ответили на вопрос, который я задал, конечно. Но я перепутал свой вопрос! Нужно отредактировать. Сожалею. –

+0

@ bob.sacamento: Мой ответ по-прежнему применим к вашему отредактированному вопросу. – jrd1

3

execfile без globals, locals аргумента, он выполняет содержимое файла в текущем пространстве имен. (то же пространство имен, которое вызывает execfile)

В то время как import выполняет указанный модуль в разделенном пространстве имен и определяет mymodule в локальном пространстве имен.

Смежные вопросы