假设我在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
?
编辑:(在这两种情况下,它打印'垃圾',问题是为什么?)
答案 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
的对象,现在已经消失了)