Python真全局变量(Python 3.7.0)
我知道你可以使用Python真全局变量(Python 3.7.0),python,variables,module,scope,global,Python,Variables,Module,Scope,Global,我知道你可以使用global关键字。但这不是…全球性的。这只是引用此函数之外的另一个变量的一种方法。如果你想引用一个变量,我想这没什么大不了的(尽管仍然很麻烦)。但是如果你有很多变量,你想在函数中移动呢?我是否必须在每个全局范围的函数中每次声明2、3或10个变量?难道没有一种方法可以声明[1]一个变量(某个地方或某种方式)以使其真正具有全局性吗 理想情况下,我希望有一个带有主代码的main.py文件和一个带有所有全局变量(声明/初始化[1])的common.py文件,并且有一个来自common
global
关键字。但这不是…全球性的。这只是引用此函数之外的另一个变量的一种方法。如果你想引用一个变量,我想这没什么大不了的(尽管仍然很麻烦)。但是如果你有很多变量,你想在函数中移动呢?我是否必须在每个全局范围的函数中每次声明2、3或10个变量?难道没有一种方法可以声明[1]一个变量(某个地方或某种方式)以使其真正具有全局性吗
理想情况下,我希望有一个带有主代码的main.py文件和一个带有所有全局变量(声明/初始化[1])的common.py文件,并且有一个来自common import*的,我将能够使用common.py中声明的每个变量
如果是重复的,我道歉。我确实到处找了,但似乎找不到什么。也许您可以使用类(?),但我试图避免在这个特定的程序中使用它们(但如果没有其他方法,我会选择)
编辑:添加代码以显示两个文件不工作的示例:
文件main.py
文件common.py
这张照片是:
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.py
sourcefile1.py
fldr/sourcefile2.py
如您所见,您甚至可以分配最初不存在的新属性(common.newVar
)
不过,更好的做法可能是将dict
放在common
中,并在其中存储各种全局值-将新键推送到dict比向模块添加新属性更容易维护操作
如果使用此方法,您将需要小心从.common import*
执行。由于名称空间的原因,这会使您永远无法更改全局变量-当您分配新值时,您只修改了本地名称空间
一般来说,你不应该因为这个原因而导入*
,但这是一个特殊的症状。从技术上讲,每个模块级变量都是全局变量,你可以在任何地方处理它们。您可能没有意识到的一个简单示例是sys
:
import sys
myfile = open('path/to/file.txt', 'w')
sys.stdout = myfile
sys.stdout
是一个全局变量。程序各个部分中的许多东西——包括您无法直接访问的部分——都在使用它,您会注意到在这里更改它将改变整个程序的行为。如果任何地方使用了print()
,它将输出到您的文件,而不是标准输出
您只需创建一个可供整个项目访问的通用源文件,即可选择此行为:
common.py
sourcefile1.py
fldr/sourcefile2.py
如您所见,您甚至可以分配最初不存在的新属性(common.newVar
)
不过,更好的做法可能是将dict
放在common
中,并在其中存储各种全局值-将新键推送到dict比向模块添加新属性更容易维护操作
如果使用此方法,您将需要小心从.common import*
执行。由于名称空间的原因,这会使您永远无法更改全局变量-当您分配新值时,您只修改了本地名称空间
一般来说,你不应该因为这个原因而导入*
,但这是一个特殊的症状。为什么不使用json或yaml文件呢?你可以在一个字典中收集所有的“真正全局”变量,所以只需要将其名称设置为“真正全局”获取对其余所有变量的访问。理想情况下,我希望一个文件main.py包含我的主代码,一个文件common.py包含我的所有全局变量(声明/初始化[1]),以及一个from common import*我可以使用common.py中声明的每个变量。
您尝试过这个吗?这是预期的工作。有什么问题吗?@Carsten@Poojan是的,它不起作用了。您仍然需要每次使用global关键字,为什么不使用json或yaml文件呢?您可以在一个字典中收集所有“真正的全局”变量,因此只需要将其名称设置为“真正的全局”获取对其余所有变量的访问。理想情况下,我希望一个文件main.py包含我的主代码,一个文件common.py包含我的所有全局变量(声明/初始化[1]),以及一个from common import*我可以使用common.py中声明的每个变量。
您尝试过这个吗?这是预期的工作。有什么问题吗?@Carsten@Poojan是的,它不起作用了。每次我似乎无法从调用时,您仍然必须使用全局关键字。进口商品
import sys
myfile = open('path/to/file.txt', 'w')
sys.stdout = myfile
var1 = 3
var2 = "Hello, World!"
from . import common
print(common.var2)
# "Hello, World!"
common.newVar = [3, 6, 8]
from .. import common
print(common.var2)
# "Hello, World!"
print(common.newVar)
# [3, 6, 8]