将行为与python导入混淆
你好 我有两个文件: a、 py: b、 py: 我不明白为什么有两个不同的变量,应该是相同的 如果我将“main”块移动到另一个文件,那么一切都会正常工作,即只有一个VAR c、 py: 所以我的问题是: 为什么a.py的最后两行打印不同的结果?将行为与python导入混淆,python,Python,你好 我有两个文件: a、 py: b、 py: 我不明白为什么有两个不同的变量,应该是相同的 如果我将“main”块移动到另一个文件,那么一切都会正常工作,即只有一个VAR c、 py: 所以我的问题是: 为什么a.py的最后两行打印不同的结果? 他们不是在a.py中打印相同的VAR变量吗? 顺便说一句,我正在win7上使用python 2.7 谢谢。你可能想仔细阅读一下?引述: 如果在函数体中的任何位置为变量指定了新值,则假定该变量为局部变量。如果在函数中为变量分配了一个新值,则该变量是隐式
他们不是在a.py中打印相同的VAR变量吗? 顺便说一句,我正在win7上使用python 2.7
谢谢。你可能想仔细阅读一下?引述: 如果在函数体中的任何位置为变量指定了新值,则假定该变量为局部变量。如果在函数中为变量分配了一个新值,则该变量是隐式局部变量,您需要显式地将其声明为“全局” 编辑:为了详细说明,下面是发生的情况(为了清楚起见,省略
c.py
):
a.py
b.py
,然后再次导入a.py
VAR
在中定义,值为1。这就结束了b的进口a.py
中的\uuuuuu main\uuuuu
部分在其自己的范围内执行VAR
被设置为-1,并且运行p()
:这显示-1,因为VAR
刚刚被设置为b.p()
,然后运行a.p()
。因为从b.py
(不同范围)的角度来看,VAR
的值仍然是1,所以print语句只输出1您还将注意到,这两个print语句中的id是不同的:这是因为
VAR
位于不同的范围内,并且没有以任何方式连接它们被断开连接,因为\uuuu main\uuu
位于不同的匿名作用域中:Python解释器执行的作用域。这在.Hi,jro中进行了简要讨论。我没有在函数中做任何赋值。所有的p()函数都只打印相同的变量VAR(在我看来),但结果是两个不同的变量,因为它们没有相同的地址,甚至没有相同的值。那么为什么c.py
中只有一个VAR
?为什么b.py在a.py
情况下有自己的VAR,而在c.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?
print('in b')
import a
def p():
a.p()
import a
import b
if __name__ == '__main__':
a.VAR = -1
a.p()
b.p()