使用python导入混淆行为

时间:2011-11-22 10:49:10

标签: python

嗨,那里。

我有两个文件:

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。

感谢。

1 个答案:

答案 0 :(得分:3)

您可能想阅读global variables?引用:

  

如果在函数体内的任何位置为变量分配了新值,则假定它是本地变量。如果在函数内部为变量赋予了新值,则该变量是隐式本地变量,您需要将其显式声明为“全局”。

编辑:详细说明,这是发生的事情(为了清楚起见,省略c.py):

  1. 执行文件a.py
  2. 导入文件b.py,然后再次导入a.py
  3. 通过b的导入,VAR的定义值为1.这结束了b的导入。
  4. __main__中的a.py部分在其自己的范围内执行 ; VAR在那里设置为-1,并且p()已运行:显示-1,因为VAR刚刚设置为。
  5. 然后执行b.p(),然后运行a.p()。因为从VAR(不同范围)的角度来看b.py仍然具有值1,所以print语句只输出1.
  6. 您还会注意到两个打印语句中的ID都不同:这是因为VAR位于不同的范围内,并且没有以任何方式连接。 它们已断开连接,因为__main__位于不同的匿名范围:Python解释器执行的范围。这在docs

    中进行了简要讨论