gpt4 book ai didi

python - 混淆行为与 python 导入

转载 作者:太空宇宙 更新时间:2023-11-03 11:09:42 25 4
gpt4 key购买 nike

你好。

我有两个文件:

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,这应该是相同的。

如果我将“主” block 移动到另一个文件,一切正常,即只有一个 VAR。

c.py:

import a
import b

if __name__ == '__main__':
a.VAR = -1
a.p()
b.p()

所以我的问题是:

为什么a.py最后两行打印出来的结果不一样?
他们不是在a.py中打印相同的VAR变量吗?

顺便说一句,我在 win7 上使用 python 2.7。

谢谢。

最佳答案

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

If a variable is assigned a new value anywhere within the function’s body, it’s assumed to be a local. If a variable is ever assigned a new value inside the function, the variable is implicitly local, and you need to explicitly declare it as ‘global’.

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

  1. 文件 a.py 被执行。
  2. 导入文件 b.py,然后再次导入 a.py
  3. 通过 b 的导入,VAR 被定义为值为 1。这结束了 b 的导入。
  4. a.py 中的__main__ 部分在其自己的范围内执行VAR 在那里设置为 -1,然后运行 ​​p():这显示 -1,因为 VAR 刚刚设置为。<
  5. 然后执行 b.p(),然后运行 ​​a.p()。因为VARb.py(作用域不同)来看还是1,所以print语句只输出1。

您还会注意到两个打印语句中的 id 不同:这是因为 VAR 存在于不同的范围内,并且没有以任何方式连接。 它们是断开连接的,因为 __main__ 位于不同的匿名范围:Python 解释器执行的范围。这在 docs 中进行了简要讨论。 .

关于python - 混淆行为与 python 导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8225562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com