【发布时间】:2014-02-24 21:54:11
【问题描述】:
假设我有一个名为foo 的Python 模块,它有一个函数bar() 和模块x = 'spam' 中的一个全局变量。 bar()使用这个x来操作。
如果我像import foo一样导入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?
编辑:(在这两种情况下它都会打印“垃圾邮件”,问题是为什么?)
【问题讨论】:
-
何不试试看?
-
我做到了,显然我对原因很感兴趣。 :)
-
语句
from foo import x查找foo.x的值,并将main的本地命名空间中的x绑定到它找到的值。变量foo.x和main.x是不同的,但恰好保持相同的值。为其中一个分配不同的值不会影响另一个。 [我无法将此作为答案发布,因为问题已关闭]。