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和模块中的全局变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章