Python在单独的模块中编辑变量



我发现了很多关于从另一个模块调用变量的信息,但我找不到任何关于在单独的模块中编辑变量的信息。

对于我使用python的第一个实际项目,我正在写一个小的文本冒险。

我有GV.py用于全局变量,Classes.py用于武器/装甲等

我想要上课。Longjidges((修改GV.py中的一个变量,特别是变量GV.weapon.

在GV.py 中

import Classes
global weapon
weapon = 'Unarmed'    

类中.py

import GV
def Longsword():
GV.weapon = 'Longsword'

这不会编辑GV.py中的可变武器…我是不是遗漏了什么?

既然有人问我,我就把输出放在这里。

来自GV.py 的回复

weapon
'Unarmed'
Classes.Longsword()
>>>>
weapon
'Unarmed'

您的问题是,当您运行脚本GV.py时,您得到的不是名为GV的模块,而是名为__main__的特殊模块。


如果你见过熟悉的主保护习惯用法,它可以用来编写一个作为模块或顶级脚本工作的单个文件,它就是这样工作的:

if __name__ == '__main__':

当您将文件作为脚本运行时,这是真的,而当您将该文件作为模块导入时,这将不是真的。


现在,当您从Classes内部执行import GV时,它会导入完全相同的GV.py文件,并从中构建第二个模块对象(当然,这个名为GV(。

因此,当您执行GV.weapon = 'longsword'时,您正在更改GV模块中的weapon全局,而不是__main__模块。


如果你想知道这是如何隐藏的:Python确保无论import Classes有多少次都只有一个Classes模块对象的方法非常简单:它只是将加载的模块缓存在dictsys.modules中,并按名称查找它们。


如果你解决了这个问题,你会遇到第二个问题:GV.py做的第一件事就是import ClassesClasses.py所做的第一件事就是对import GV。这是一个循环导入。


处理这两个问题的常用方法非常简单:将共享全局变量放在一个简单的模块中,该模块除了保存这些共享全局变量之外几乎没有什么作用,所以每个人都可以importit:

# main.py
import classes
import GV
GV.weapon = 'Unarmed'
# Classes.py
import GV
def Longsword():
GV.weapon = 'Longsword'
# GV.py
# empty... or you can move weapon = 'Unarmed' here

最新更新