Python 3:跨模块的全局变量的可见性

Posted

技术标签:

【中文标题】Python 3:跨模块的全局变量的可见性【英文标题】:Python 3: The visibility of global variables across modules 【发布时间】:2017-04-30 05:50:02 【问题描述】:

之前有人问过类似的问题:

here、here 和 here,我知道这些。

假设您有 2 个模块,其中一个具有要从另一个模块中读取的全局变量。有没有办法让这些跨模块访问,而不必每次都将它们称为 module.variable?

例子:

modulea.py:

import moduleb
from moduleb import *

print("A String: " + astring)
print("Module B: " + moduleb.astring)
afunction()
print("A String: " + astring)
print("Module B: " + moduleb.astring)

moduleb.py:

astring = "dlroW olleH"

def afunction():
    global astring
    astring = "Hello World"

输出是

A String: dlroW olleH
Module B: dlroW olleH
A String: dlroW olleH
Module B: Hello World

建议通过使用“from module import *”来复制全局变量而不是引用。

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

from module import *module 中的对象绑定到当前模块中的命名变量。这不是复制,而是添加对同一对象的引用。两个模块将看到相同的对象,直到其中一个重新绑定对象。修改可变对象不会重新绑定变量,因此可以执行附加到列表等操作。但是重新分配变量确实会重新绑定它。通常重新绑定是直截了当的:

myvar = something_else

但有时不太清楚

myvar += 1

对于 intstr 等不可变对象,这会重新绑定变量,现在两个模块具有不同的值。

如果您想确保始终引用同一个对象,请保留命名空间引用。

【讨论】:

以上是关于Python 3:跨模块的全局变量的可见性的主要内容,如果未能解决你的问题,请参考以下文章

跨模块和全局变量的 Python 导入

Python实现跨文件全局变量的方法

Python实现跨文件全局变量的方法(摘抄版)

python中各模块变量共享的问题。

python-跨文件的全局变量,该如何是好

Python实现跨文件全局变量的方法(2文件优化版)