Python全局变量在文件执行与REPL中的异常行为问询
为什么直接运行脚本和导入模块后全局变量值不一样?
这是个非常典型的Python模块执行逻辑问题,刚好能帮你理清两种运行场景的核心差异:
1. 直接运行bug.py时的逻辑
当你直接执行脚本(比如python bug.py),Python会把这个文件当作主程序来运行,此时文件的__name__属性会被设置为'__main__',所以if __name__ == '__main__':条件成立,里面的代码会被执行:
- 调用
foo()函数,函数里用global x声明要修改全局作用域的x,把它改成100 - 随后
print(x)输出修改后的100,这和你的预期完全一致
2. 在REPL中导入模块时的逻辑
当你在REPL里执行import bug,Python会加载这个模块,但此时模块的__name__属性是模块名'bug',不会触发if __name__ == '__main__':块里的代码——也就是说,foo()函数根本没被调用过!
所以模块里的x还是初始定义的0,自然不会变成100。
验证一下这个逻辑
你可以在REPL里试试这几步,直观感受差异:
>>> import bug >>> bug.x # 此时还没调用foo,x是初始值 0 >>> bug.foo() # 手动调用函数修改全局变量 >>> bug.x # 现在x已经被改成100了 100
额外提一句全局变量的问题
正如你所说,Python不建议使用全局变量,这个例子其实也能体现原因:模块的状态依赖是否执行了特定函数,很容易造成混淆,后续维护时也很难追踪变量的变化路径。如果需要维护模块内的状态,用类或者封装后的函数会更清晰可控。
内容的提问来源于stack exchange,提问作者Jans Aasman
相关产品推荐
相关产品推荐

