我已经找到了很多有关从另一个模块调用变量的信息,但是我找不到关于在单独的模块中编辑变量的任何信息。
对于我第一个使用python的实际项目,我正在写一些文字冒险。
我有GV.py用于全局变量,而Classes.py用于武器/装甲等。
我希望Classes.Longsword()修改GV.py中的变量,特别是变量GV.weapon。
在GV.py
import Classes
global weapon
weapon = 'Unarmed'
在Classes.py
import GV
def Longsword():
GV.weapon = 'Longsword'
这不会编辑GV.py中的可变武器。我缺少什么了吗?
因为有人问我将输出放在这里。
来自GV.py的副本
weapon
'Unarmed'
Classes.Longsword()
>>>>
weapon
'Unarmed'
答案 0 :(得分:0)
您的问题是,当您运行脚本GV.py
时,得到的不是一个名为GV
的模块,而是一个名为__main__
的特殊模块。
如果您已经看到了熟悉的主后卫习惯用法,可以用来编写一个用作模块或顶级脚本的文件,这就是它的工作原理:
if __name__ == '__main__':
将文件作为脚本运行时将是正确的,而将文件作为模块导入时将不正确。
现在,当您从import GV
内部进行Classes
时,该操作将导入完全相同的GV.py
文件,并从中构建第二个模块对象(当然, 是名为GV
)。
因此,当您随后进行GV.weapon = 'longsword'
时,您是在weapon
模块而不是GV
模块中更改__main__
全局。
如果您想知道它的幕后工作原理:无论您Classes
死了多少次,Python都会确保只有一个import Classes
模块对象的方式:它只是缓存加载的模块sys.modules
,然后按名称查找它们。
如果您解决了这个问题,这里就会遇到第二个问题:GV.py
要做的第一件事就是import Classes
。 Classes.py
要做的第一件事是import GV
。这是循环导入。
处理这两个问题的常用方法非常简单:将共享全局变量放在一个简单的模块中,除了保存这些共享全局变量外,几乎没有任何其他作用,因此每个人都可以{{1} }:
import