Python真正的全局变量(Python 3.7.0)



我知道您可以使用global关键字。但那不是。。。全球的这只是引用该函数之外的另一个变量的一种方式。如果你想引用一个变量,我想这没什么大不了的(尽管仍然很麻烦(。但是,如果有很多变量想要在函数中移动,该怎么办?在每个全局范围的函数中,我每次都必须声明这2、3或10个变量吗?难道没有一种方法可以声明[1]一个变量(在某个地方或以某种方式(,使其成为真正的全局变量吗?

理想情况下,我希望有一个包含我的主代码的文件main.py,以及一个包含所有全局变量(已声明/已初始化[1](的文件common.py,并且有了from common import *,我将能够使用common.py中声明的每个变量。

如果是重复的,我道歉。我确实四处寻找,但似乎找不到什么东西。也许你可以用类(?(来做,但我尽量避免在这个特定的程序中使用它们(但如果没有其他方法,我会采用(

编辑:添加代码以显示两个文件不工作的示例:

文件main.py

from common import *
def func1():
x=2
print('func1', x)
def func2():
print('fuc2',x)
print('a',x)
func1()
func2()

文件common.py

x=3

这个打印:

a 3
func1 2
fuc2 3

但它应该打印:

a 3
func1 2
fuc2 2

因为func2即使在func1之后调用(其中x被赋值(,也会将x视为3。这意味着fuc1实际上并没有使用"全局"变量x,而是使用了一个与"全局"不同的局部变量x。如果我错了,请纠正我


[1]我知道在python中,你并没有真正声明变量,你只是初始化它们,但你明白我的意思

从技术上讲,每个模块级变量都是全局的,您可以在任何地方使用它们。一个你可能没有意识到的简单例子是sys:

import sys
myfile = open('path/to/file.txt', 'w')
sys.stdout = myfile

sys.stdout是一个全局变量。程序的各个部分中的许多东西——包括您无法直接访问的部分——都会使用它,您会注意到在这里更改它将改变整个程序的行为。如果在任何地方使用print(),它将输出到您的文件,而不是标准输出。

您可以通过简单地创建一个可供整个项目访问的common源文件来选择这种行为:

common.py

var1 = 3
var2 = "Hello, World!"

sourcefile1.py

from . import common
print(common.var2)
# "Hello, World!"
common.newVar = [3, 6, 8]

fldr/sourcefile2.py

from .. import common
print(common.var2)
# "Hello, World!"
print(common.newVar)
# [3, 6, 8]

正如您所看到的,您甚至可以分配最初不存在的新属性(common.newVar(。

然而,更好的做法可能是简单地将dict放在common中,并在其中存储各种全局值——向dict推送新键比向模块添加新属性更容易维护。


如果您使用此方法,您将需要小心执行from .common import *。由于名称空间的原因,这将使您无法更改全局变量——当您分配新值时,您只修改了本地名称空间。

一般来说,出于这个原因,你不应该做import *,但这是一个特殊的症状。

最新更新