我发现了很多关于从另一个模块调用变量的信息,但我找不到任何关于在单独的模块中编辑变量的信息。
对于我使用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 Classes
。Classes.py
所做的第一件事就是对import GV
。这是一个循环导入。
处理这两个问题的常用方法非常简单:将共享全局变量放在一个简单的模块中,该模块除了保存这些共享全局变量之外几乎没有什么作用,所以每个人都可以import
it:
# 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