今天我不得不阅读并修复一些非常糟糕的脚本,我很困惑,因为我根本不明白它们为什么起作用。明确地说,我永远不会做这样的事情。我的问题是指在这种情况下命名空间如何工作 ,而不是为什么这是一个坏主意或如何做得更好。
无论如何,可以用两个文件再现最简单形式的情况。test.py
:
import math
math.myvar = "Is this a local variable?"
math.pi = 1.2345
import u
u.py
:import math
print(math.myvar)
print(math.pi)
现在,令我惊讶的是运行
python test.py
将打印 myvar
以及 pi 的错误值。当然,没有import math
在 u.py
它不会打印 myvar
.这是怎么发生的?我虽然导入的模块在范围内完全是本地的。
最佳答案
模块是全局单例。它们存储在 sys.modules
中映射,以防止每次在某处使用时都必须加载每个模块。
模块中的所有全局变量都作为模块对象的属性公开; math.pi
就是这样一种全局性的。您可以通过分配给它们来更改这些全局变量,并且因为模块是单例对象,所以对模块对象的每个引用都会看到更改。
请记住,Python 名称是引用;名称 math
确实是您的模块的“本地”,但它仍然是对全局 <module 'math' from '/usr/lib/python2.7/lib-dynload/math.so'>
的引用目的。
关于python - 通过更改和导入模块在 Python 中传递 "local"变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23636736/