Python跨文件导入自定义函数时全局变量触发NameError问题
错误原因
- Python 的全局变量是模块级作用域:
global关键字声明的全局变量仅属于当前代码所在模块的命名空间,无法跨模块共享。main.py中声明的global level存放在main模块的命名空间下,和level.py的命名空间完全独立level.py中的level_list函数执行时,查找变量的优先级为:自身函数作用域 →level模块的全局作用域,永远不会主动到main模块的作用域查找变量,因此抛出未定义的报错
- 你的代码还存在命名冲突问题:导入的模块名为
level,你又定义了同名的全局变量level,会直接把导入的level模块对象覆盖,就算作用域问题解决,后续调用函数也会报错。
修复方案
方案1:将level作为参数传入函数(最推荐,符合低耦合开发规范)
修改level.py,把变量作为入参引入:
def level_list(level): if level == '1': # 执行对应操作 elif level == '2': # 执行对应操作 elif level == '3': # 执行对应操作
修改main.py,调用时传参即可:
import level def pick_level(): # 直接返回输入结果,不需要声明global return input("Type 1, 2 or 3") user_level = pick_level() level.level_list(user_level)
方案2:给level模块添加全局属性(可实现需求但不推荐)
如果你一定要用全局变量的写法,可以直接给导入的level模块赋值同名属性,对应level.py的代码不需要修改,只需改main.py:
import level def pick_level(): # 直接给level模块的全局命名空间赋值 level.level = input("Type 1, 2 or 3") pick_level() level.level_list()
内容的提问来源于stack exchange,提问作者Jared McCallister
相关产品推荐
相关产品推荐

