在Python模块中使用全局变量

Yan*_*nis 0 python global-variables

我有这4个模块globals.py

globvara = "a"
Run Code Online (Sandbox Code Playgroud)

mod1.py

from globals import *

print globvara
Run Code Online (Sandbox Code Playgroud)

输出:a

mod2.py

from mod1 import *

def changegv(newval1):
    #global globvara
    globvara = newval1

def usechangegv(newval2):
    changegv(newval2)
Run Code Online (Sandbox Code Playgroud)

和mod3.py

from mod2 import *

usechangegv("b")

print globvara
Run Code Online (Sandbox Code Playgroud)

输出:a

我想知道为什么globalvar在模块2中不会改变.我在全局变量中缺少一些东西.即使我取消注释全局globvara线,我也得到相同的结果.错误在哪里?

kin*_*all 5

Python全局变量仅对模块是全局变量.从另一个模块(例如from mod1 import *)导入变量时,Python会在导入模块中创建对该值的重复引用.所以,你现在有两个名字,mod1.globvaramod2.globvara,最初指向相同的值,但其不在有任何关系.如果您改变globvaramod2.py,那么您正在改变mod2.globvara并且mod1.globvara 不会受到影响.

要避免此问题,请导入模块,而不是导入模块中定义的单个名称.例如,import globals.然后总是参考globals.globvara(或更好globals.a).由于您始终访问并分配相同的名称,因此它将按您期望的方式工作.