嗨,那里。
我有两个文件:
a.py:的
print('in a')
import b
print('var')
VAR = 1
def p():
print('{}, {}'.format(VAR, id(VAR)))
if __name__ == '__main__':
VAR = -1
p()
b.p() # Where does this VAR come from?
b.py:的
print('in b')
import a
def p():
a.p()
我不明白为什么会有两种不同的VAR,这应该是相同的。
如果我将'main'块移动到另一个文件,一切都运行良好,即只有一个VAR。
c.py:的
import a
import b
if __name__ == '__main__':
a.VAR = -1
a.p()
b.p()
所以我的问题是:
为什么a.py的最后两行打印出不同的结果?
他们不是在a.py中打印相同的VAR变量吗?
BTW,我在win7上使用python 2.7。
感谢。
答案 0 :(得分:3)
您可能想阅读global variables?引用:
如果在函数体内的任何位置为变量分配了新值,则假定它是本地变量。如果在函数内部为变量赋予了新值,则该变量是隐式本地变量,您需要将其显式声明为“全局”。
编辑:详细说明,这是发生的事情(为了清楚起见,省略c.py
):
a.py
。b.py
,然后再次导入a.py
。VAR
的定义值为1.这结束了b的导入。__main__
中的a.py
部分在其自己的范围内执行 ; VAR
在那里设置为-1,并且p()
已运行:显示-1,因为VAR
刚刚设置为。b.p()
,然后运行a.p()
。因为从VAR
(不同范围)的角度来看b.py
仍然具有值1,所以print语句只输出1. 您还会注意到两个打印语句中的ID都不同:这是因为VAR
位于不同的范围内,并且没有以任何方式连接。 它们已断开连接,因为__main__
位于不同的匿名范围:Python解释器执行的范围。这在docs。