【问题标题】:Python true global variables (python 3.7.0)Python 真正的全局变量(python 3.7.0)
【发布时间】:2020-02-18 15:53:58
【问题描述】:

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

理想情况下,我希望一个文件 main.py 包含我的主要代码,一个文件 common.py 包含我的所有全局变量(已声明/初始化 [1] ) 并使用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 中你并没有真正声明变量,你只是初始化它们,但你明白我的意思

【问题讨论】:

  • 为什么不使用 json 或 yaml 文件呢?
  • 您可以将所有“真正全局”变量收集在一个字典中,因此只需将其名称设为“真正全局”即可访问所有其他变量。
  • Ideally I would like to have one file main.py with my main code and one file common.py with all my global variables (declared/initialized[1]) and with a from common import * I would be able to use every variable declared in common.py. 你试过这个吗?这按预期工作。有什么问题?
  • @Carsten 请详细说明。
  • @Poojan 我做了,它不起作用。每次还是要使用全局关键字

标签: python variables module scope global


【解决方案1】:

从技术上讲,每个模块级变量都是全局变量,您可以在任何地方处理它们。一个你可能没有意识到的简单例子是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 *,但这是它的特殊症状。

【讨论】:

  • 我似乎无法致电from . import common。它返回 ImportError: cannot import name 'common' from '__ main __' (C:\Users\ [user] \Desktop\d\sourcefile1.py)。顺便说一句,我在 Python 3.7.0 中
  • @Monochromatic 你可以试试import .common 甚至import common。相对导入以奇怪的方式工作。
  • import common 成功了,它实际上按照我想要的方式运行。感谢您的回答,我将寻找更多的各种进口产品。不过,我没有得到反对票。这是重复的吗?我能找到的只是关于 global 关键字的答案
猜你喜欢
  • 2015-01-03
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多