我可以要求导入的模块修改main.py的全局变量吗?

时间:2018-06-19 19:19:42

标签: python module global-variables

显然这不起作用:

#module.py
def modifyglobals():
    global a
    a = 12

#main.py
from module import modifyglobals
modifyglobals()
print a  # NameError: name 'a' is not defined

因为我认为它修改了module.py的全局变量,而不是main.py的全局变量。

另一方面,我期望这会起作用:

#module.py
def modifyglobals(g):
    g()['a'] = 12

#main.py
from module import modifyglobals
modifyglobals(g=globals)  # pass a reference to **main's globals** to modifyglobals
print a

但是它仍然给出NameError: name 'a' is not defined

问题:为什么main.py不会传递对其自身全局变量的引用,以便被调用的函数可以修改main.py的全局变量?

2 个答案:

答案 0 :(得分:0)

如果要访问模块的全局变量,可以执行以下操作:

# module.py
def modifyglobals():
    global a
    a = 12

# main.py
import module

module.modifyglobals()
print(module.a)

如果您想修改main.py的全局变量,可以改为执行以下操作:

# module.py
def modifyglobals(mod):
    mod['a'] = 12

# main.py
import module

a = None

module.modifyglobals(globals())
print(a)

也就是说,我真的不鼓励您完全不使用这两种方式。我个人很少考虑使用模块全局变量。如果我决定定义模块全局变量是因为我将在模块级别将它们用作私有变量,或者将其用作单例模块,模块的常量或模块的缓存。有更好的方法可以在模块之间进行数据传输,不应使用上述方法。

答案 1 :(得分:0)

  

为什么main.py不能传递对自身全局变量的引用,以便被调用的函数可以修改main.py的全局变量?

因为g=globals传递了globals 函数,所以没有传递任何特定的全局变量dict。调用globals时,它将返回称为globals的任何代码的全局变量dict。您仍然最终在globals中而不是在module.py中呼叫main.py,因此获得了module.py的全局变量。

传递实际的全局变量dict:

#module.py
def modifyglobals(g):
    g['a'] = 12

#main.py
from module import modifyglobals
modifyglobals(g=globals())
print a

当然,在大多数情况下,让函数直接修改其调用者的全局变量是一个坏主意。实际上不这样做。