Python 3和模块中的全局变量[重复]

Posted

技术标签:

【中文标题】Python 3和模块中的全局变量[重复]【英文标题】:Python 3 and global variable in module [duplicate] 【发布时间】:2020-03-31 21:54:26 【问题描述】:

main1.py

import mya
a=10
mya.increment_a()
a=a-5
print(a)

模块 mya.py

def increment_a():
    global a

    a=a+1
    print(a)

名称“a”未定义。 我不明白为什么。我在模块中将变量 a 声明为全局变量,因此从此时开始 a=0 就像在 mail1.py 中一样 upd:我需要在全球范围内工作。在 main.py 中设置变量“a”的起始值,模块 mya.py 中的函数将编辑“a”,并将新值返回给 main.py 以供进一步使用。 ---封闭主题--- 现在我在工作中使用“arguments”和“return”:

mya.py

def increment_a(a):
    a=a+1
    print(a)
    return a

main1.py

import mya
a=0
print(a)
a=mya.increment_a(a)
a=a+10
print(a)

【问题讨论】:

这能回答你的问题吗? Visibility of global variables in imported modules 我需要在全球范围内使用“a”。在 main.py 中设置变量“a”的起始值,模块 mya.py 中的函数将编辑“a”,并将新值返回给 main.py。 @RedSubmarine 不,你不需要需要,事实上,依赖全局可变状态被认为是一种反模式。 Python 本身不支持真正的全局变量,global 表示“模块级全局”。最好的解决方案是改进您的设计以避免全局可变状态 所以唯一的全局工作方法是将所有函数从 mya.py 移动到 main1.py? @RedSubmarine 或者你可以直接在main1.py 中的模块上工作,所以mya.a = foo 等等。但同样,这都是一个糟糕的做法。不要这样做。 【参考方案1】:

来自Visibility of global variables in imported modules:

Python 中的全局变量对一个模块来说是全局的,而不是跨所有模块。 (很多人对此感到困惑,因为在 C 语言中,全局在所有实现文件中都是相同的,除非您明确将其设为 static。)

处理它的一种方法是:

import mya
mya.a=3
mya.increment_a()

【讨论】:

由于您确定该问题是重复的,因此您无需发布答案。 我不确定这是如何工作的,以防万一。我应该删除它吗? 我阅读了所有相关主题,但对这种情况一无所知。是的,这种方法可以修复错误。但我不仅需要在模块中使用变量 a 。我需要在全球范围内工作。在 main.py 中设置变量“a”的起始值,模块 mya.py 中的函数将编辑“a”,并将新值返回给 main.py。对于建议的方法,它不起作用。 @RedSubmarine 最好的解决方案是不依赖全局可变状态。因此,要么编写函数以将数据作为参数并将数据作为返回值返回,要么编写一个类来封装状态,并在模块中使用该类的实例。 链接的帖子提出了一些替代方案,例如在单独导入的模块shared_stuff 的命名空间中设置属性,并让其他模块也导入它。

以上是关于Python 3和模块中的全局变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中的多处理期间访问全局变量 [重复]

python中的多处理模块和修改共享的全局变量

Python 全局变量扫盲

Python 3:跨模块的全局变量的可见性

从python中的异步函数修改全局变量[重复]

Python 模块中的一些全局变量