在Python模块中使用全局变量

问题描述 投票:0回答:2

我有这4个模块

全局.py

globvara = "a"

mod1.py

from globals import *

print globvara

输出:

a

mod2.py

from mod1 import *

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

def usechangegv(newval2):
    changegv(newval2)

和mod3.py

from mod2 import *

usechangegv("b")

print globvara

输出:

a
a

我想知道为什么模块 2 中的全局变量没有改变。我在全局变量中遗漏了一些东西。即使我取消注释

global globvara
行,我也会得到相同的结果。哪里出错了?

python global-variables
2个回答
5
投票

Python 全局变量仅对模块是全局的。当您从另一个模块导入变量时(例如

from mod1 import *
),Python 会创建对导入模块中的值的 duplicate 引用。因此,您现在有两个名称,
mod1.globvara
mod2.globvara
,它们最初指向相同的值,但没有以任何方式连接。如果您在
globvara
中更改
mod2.py
,则您正在更改
mod2.globvara
,并且
mod1.globvara
不受影响。

为了避免此问题,请导入模块,而不是其中定义的各个名称。 例如,

import globals
。 然后始终参考
globals.globvara
(或者更好,
globals.a
)。由于您始终访问和分配相同的名称,因此它将按照您期望的方式工作。


1
投票

请勿使用

from <module> import <variable>

因为它创建了变量的副本。

做一个简单的:

import <module>

所有对全局变量的访问都应该使用“模块”中的“变量”:

<module>.<variable> = ...

print <module>.<variable>
© www.soinside.com 2019 - 2024. All rights reserved.