在Python模块中使用全局变量

在Python模块中使用全局变量,python,global-variables,Python,Global Variables,我有这4个模块 globals.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

我有这4个模块 globals.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中的globalvar没有改变。我在全局变量中遗漏了一些东西。即使取消对全局globvara行的注释,也会得到相同的结果。错误在哪里?

Python全局变量仅对模块是全局的。当您从另一个模块导入变量时(例如,从mod1 import*),Python会在导入模块中创建对该值的重复引用。现在有两个名称,
mod1.globvara
mod2.globvara
,它们最初指向相同的值,但没有任何连接。如果您在
mod2.py
中更改
globvara
,则您正在更改
mod2.globvara
并且
mod1.globvara
不受影响


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

Python全局变量仅对模块是全局的。当您从另一个模块导入变量时(例如,从mod1 import*),Python会在导入模块中创建对该值的重复引用。现在有两个名称,
mod1.globvara
mod2.globvara
,它们最初指向相同的值,但没有任何连接。如果您在
mod2.py
中更改
globvara
,则您正在更改
mod2.globvara
并且
mod1.globvara
不受影响

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

不要使用

from <module> import <variable>
来自导入的

当它创建变量的副本时

做一个简单的练习:

import <module>
导入
所有对全局变量的访问都应该使用“模块”中的“变量”:

=。。。

打印。
不要使用

from <module> import <variable>
来自导入的

当它创建变量的副本时

做一个简单的练习:

import <module>
导入
所有对全局变量的访问都应该使用“模块”中的“变量”:

=。。。

打印。

出于兴趣,您这样做是为了熟悉Python中的作用域是如何工作的,还是在您正在编写的程序中确实存在这种情况?我正在处理一个更大的项目,并对其进行了简化。相关:(但我认为这并不是一个区别,因为这个问题想在每个模块中分配给
globvara
,而不仅仅是访问它,因为他不是问如何“解决”这个问题,只是问发生了什么)。就赋值而言:假设您知道即使存在同名的全局,也会创建一个新的本地,除非您取消注释该
global
语句。但即使使用该语句,它也会创建一个新的(模块-)全局的,即使有一个同名的内建,也没有
内建
语句来覆盖它。出于兴趣,您这样做是为了熟悉Python中的作用域是如何工作的,还是在您编写的程序中确实有这样的情况?我正在处理一个更大的项目,并简化了它。相关:(但我认为这并不是一个区别,因为这个问题想在每个模块中分配给
globvara
,而不仅仅是访问它,因为他不是问如何“解决”这个问题,只是问发生了什么)。就赋值而言:假设您知道即使存在同名的全局,也会创建一个新的本地,除非您取消注释该
global
语句。但即使使用该语句,它也会创建一个新的(模块-)全局的,即使有一个同名的内建,也没有
内建
语句来覆盖它。正如我所解释的,你不能;不是你想要的方式。好的。谢谢。我会检查它。@Yannis:实际上,你可以,通过将它存储在内建而不是模块中。但是你真的,真的不想。(请参阅了解为什么不,以及如何使用。)还要注意内置函数globals-最好为您的模块使用另一个名称。正如我所解释的,您不能;不是您想要的方式。好的。谢谢。我会检查它。@Yannis:实际上,您可以,通过将其存储在内置函数中而不是存储在模块中。但您真的,真的不想这样做。(请参阅了解为什么不,以及如何使用。)还要注意内置函数globals-最好为模块使用另一个名称。