Python模块范围

时间:2014-02-24 21:54:11

标签: python module scope

假设我在Python中有一个名为foo的模块,它在模块bar()中有一个函数x = 'spam'和一个全局变量。 bar()使用此x进行操作。

如果我导入foo import foo,然后拨打foo.bar(),则会发生什么事情。

但是,如果我这样导入bar()from foo import bar,并且我调用bar(),如果我的全局命名空间中还有变量x,会发生什么?

foo.py

x = 'spam'
def bar():
    print x

main.py

from foo import bar
x = 'eggs'
bar()

如果我用此替换导入行怎么办:from foo import bar, x

编辑:(在这两种情况下,它打印'垃圾',问题是为什么?)

2 个答案:

答案 0 :(得分:1)

函数是在创建时保留有关自身的各种信息的对象。 检查bar.__module__bar.__globals__的值,显然它是如何工作的。

答案 1 :(得分:0)

from foo import bar导入foo(不带参考),并创建一个引用bar的本地foo.bar

bar无法看到main.x


你可以这样做类似的事情:

import foo
bar = foo.bar
del foo

(除非您已经有一个名为foo的对象,现在已经消失了)