python globals:import vs. execfile

时间:2014-02-04 04:26:30

标签: python module namespaces

我在文件mymodule.py中添加了一个方法:

def do_something():
    global a
    a=1

如果我尝试

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

我按照预期得到“1”。但是如果我改为导入模块,

>>> from mymodule import *

然后运行do_something(),然后python会话对变量“a”一无所知。

有人可以向我解释这个区别吗?感谢。

2 个答案:

答案 0 :(得分:3)

execfile没有globalslocals参数,它执行当前命名空间中的文件内容。 (调用execfile)的相同名称空间

while import在分离的命名空间中执行指定的模块,并在本地命名空间中定义mymodule

答案 1 :(得分:1)

在您导入mymodule的第二部分中,它未显示的原因是amymodule的命名空间是全局的,就像这样做。

尝试:

print mymodule.a

打印:

1

正如所料。

根据Python documentation

  

全球声明是一个适用于整个声明的声明   当前代码块。这意味着列出的标识符是   解释为全局变量。分配到全球是不可能的   变量没有全局变量,尽管自由变量可以引用全局变量   没有被宣布为全球性。

     

全局语句中列出的名称不得在同一代码中使用   在该全局语句之前的文本块。

     

全局声明中列出的名称不得定义为正式名称   参数或for循环控制目标,类定义,函数   定义或导入声明。