python - 通过更改和导入模块在 Python 中传递 "local"变量?

标签 python import module namespaces scope

今天我不得不阅读并修复一些非常糟糕的脚本,我很困惑,因为我根本不明白它们为什么起作用。明确地说,我永远不会做这样的事情。我的问题是指在这种情况下命名空间如何工作 ,而不是为什么这是一个坏主意或如何做得更好。

无论如何,可以用两个文件再现最简单形式的情况。
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 mathu.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/

相关文章:

typescript - 如何在模块本身内部为模块定义类型?

python - 使 Python 脚本与 xargs 一起工作

python - 使用字典替换句子中的单词

python - Osascript 需要论证,我认为它已经有了。 Python/终端

python - 如何判断 undefined variable 是否在 Python 列表中?

python - 无法导入模块 'lambda_function' : No module named '_speech_py_impl'

android - 无法在 React Native 中使用新导入的组件?

python - 模块未找到错误 : No module named 'sklearn.neighbours'

import - 为什么 Erlang 既为模块提供 `import`,又为 header 提供 `include`?

import - ES2015 `import * as` 与普通 `import` 之间的区别