Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python真全局变量(Python 3.7.0)_Python_Variables_Module_Scope_Global - Fatal编程技术网

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]