使用全局变量有可能在导入期间改变模块行为吗?

Posted

技术标签:

【中文标题】使用全局变量有可能在导入期间改变模块行为吗?【英文标题】:Using global variable has the potential to change module behavior during the import? 【发布时间】:2013-04-21 22:20:29 【问题描述】:

Google Python style guide 表示,使用全局变量的一个缺点是:

“在导入期间有可能改变模块行为,因为模块级变量的赋值是在导入模块时完成的”。

我对这句话的理解是,“导入模块A 的模块级变量影响导入模块A 的模块B 的行为”,这在语义上是否正确?

如果是,则A 中的任何模块级变量 var 只能由A.varB 中访问。我不明白为什么导入 A 会改变 B 的行为。

如果我误解了句子,​​正确的解释是什么?

谢谢!

【问题讨论】:

我认为该声明指的是from x import * 可以吗? 这可能不是这样,因为样式指南在介绍这里讨论的主题之前讨论了“from x import *”(给 x 是一个模块而不是包名称的前缀)的缺点。 【参考方案1】:

我相信有一个导入缓存可以避免在单个程序执行期间多次重新导入同一个模块。

但是,例如,模块级全局可以设置为由 time.time() 或类似方法播种的随机数。如果将随机数用作除数,有时在导入模块时会被除以零,有时则不会。

【讨论】:

在您的情况下,即使随机数 不是 模块级变量,仍然有可能得到除以零异常。导入行为在这里有什么作用吗?谢谢。【参考方案2】:

在考虑了我的问题一段时间后,我有了以下想法。

考虑以下三个文件:

文件 1:foo.py

x = 1

文件 2:bar.py

import foo
foo.x = 2
def func():
  pass

文件 3:main.py

import foo
foo.x = 3

# Now I need some function in bar...    
import bar
bar.func()

print foo.x

只浏览main.py,很难想象为什么foo.x会是2。这是因为当main.py 导入 barfoo.x 的值在 bar.py 中被改变。

这可能不是最好的答案。欢迎大家指正或补充说明。

【讨论】:

以上是关于使用全局变量有可能在导入期间改变模块行为吗?的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式开发基础之线程间通信

QT如何设置可变的全局变量

python 变量问题 提问有大佬知道吗?

在模块内调用全局变量

从导入模块中的函数访问全局变量

android 全局变量怎么用