Python中如何将模块变量作为内部类变量的引用使用
关于Python模块变量导入与全局访问的问题解答
核心结论
不建议使用from var_module import my_var替代你当前main.py中的导入写法,原因涉及Python导入机制与变量作用域规则两方面:
原因说明
1. 导入机制的本质差异
Python中from 模块 import 变量的写法,本质是在当前模块的命名空间下新建一个局部变量,拷贝了原模块变量的引用指向。如果你后续直接对这个导入的变量赋值:
from var_module import my_var my_var = self.local_list
你修改的只是当前模块(main.py)下局部变量my_var的指向,完全不会修改var_module模块中原变量的指向,达不到全局同步更新的效果。
而你当前使用var_module.my_var的写法是直接操作原模块命名空间下的变量,是符合需求的正确写法。
2. 变量遮蔽风险确实存在
如果你使用from var_module import my_var导入,在类方法内确实可能遇到变量遮蔽问题:
- 如果方法内仅读取
my_var,且没有出现同名的局部变量赋值,Python会向上查找到导入的全局变量,不会出问题 - 如果方法内不小心写了
my_var = xxx的赋值逻辑,Python会将my_var识别为方法的局部变量,此时如果赋值前读取该变量会直接抛出UnboundLocalError,排查成本较高
而用var_module.my_var的写法可以完全规避这个问题,明确指定了访问的是模块下的变量,不会和局部变量冲突。
额外注意:var_reader.py的隐藏问题
你当前var_reader.py中使用from var_module import my_var的写法存在逻辑漏洞:var_reader导入时会拷贝var_module.my_var当时的引用(也就是初始值None),后续你在main.py中给var_module.my_var重新赋值为列表的操作,并不会同步修改var_reader中my_var的指向,运行时会抛出TypeError: 'NoneType' object is not subscriptable错误。
有两种修复方案可选:
- 修改
var_reader.py的导入方式为import var_module,访问时写print("var: %s" % var_module.my_var[pos]) - 不重新给
var_module.my_var赋值,初始时就将其设置为列表my_var = [],后续仅修改列表内容(比如var_module.my_var.extend(self.local_list)),不改变它的指向,此时所有导入该变量的地方都能看到更新后的内容
内容的提问来源于stack exchange,提问作者CostinC
相关产品推荐
相关产品推荐

