在Python模块中使用全局变量
我有这4个模块 globals.py在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
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-最好为模块使用另一个名称。