单独模块中的Python编辑变量

时间:2018-07-16 02:10:36

标签: python variables module

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

对于我第一个使用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'

1 个答案:

答案 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 ClassesClasses.py要做的第一件事是import GV。这是循环导入。


处理这两个问题的常用方法非常简单:将共享全局变量放在一个简单的模块中,除了保存这些共享全局变量外,几乎没有任何其他作用,因此每个人都可以{{1} }:

import