Python跨文件全局变量未定义问题求助
问题分析与解决
问题1:模块函数内的变量无法在主程序访问
你碰到的NameError是Python变量作用域规则导致的:
- 当函数写在主程序里时,你可能是通过
global声明让变量成为全局变量,或者误打误撞在全局作用域定义了变量;但把函数放到独立模块后,函数内部定义的变量默认是函数局部变量,主程序的作用域根本无法直接访问。就算你在模块里把变量定义成全局变量,主程序也得通过模块名.变量名的方式引用,不能直接用变量名。
解决方案
最规范可靠的方式是让函数返回变量值,主程序调用时接收:
# func_betriebssysteme.py def betriebssystem(): # 你的业务逻辑 betriebssystem_use = "win32" return betriebssystem_use # 主程序 import func_betriebssysteme betriebssystem_use = func_betriebssysteme.betriebssystem() print(betriebssystem_use) # 正常访问
如果非要用模块级全局变量,主程序必须通过模块前缀引用:
# func_betriebssysteme.py betriebssystem_use = None def betriebssystem(): global betriebssystem_use betriebssystem_use = "win32" # 主程序 import func_betriebssysteme func_betriebssysteme.betriebssystem() print(func_betriebssysteme.betriebssystem_use) # 必须加模块前缀
问题2:from...import *后首次访问变量报错,二次运行正常
这是Jupyter Notebook的单元格运行特性导致的:
- 用
from func_ausschr.func_betriebssysteme import *时,导入的是模块当前内存中已存在的全局变量。如果bsuse是在betriebssystem()执行后才赋值的,第一次运行单元格时,你先执行了导入,然后直接访问bsuse,但此时函数还没调用,模块里的bsuse要么没定义要么是初始值,所以报错。 - 重新运行单元格时,之前已经调用过一次
betriebssystem(),模块里的bsuse已经存在于内存中,这次导入会把这个已存在的变量带入主程序作用域,所以能正常访问。
解决方案
绝对不要依赖“函数执行后生成的模块全局变量”,还是用函数返回值的方式最稳妥:
# func_betriebssysteme.py def betriebssystem(): bsuse = "win32" return bsuse # 主程序单元格 from func_ausschr.func_betriebssysteme import betriebssystem bsuse = betriebssystem() print(bsuse) # 无论运行多少次、重启内核后都正常
内容的提问来源于stack exchange,提问作者robebo
相关产品推荐
相关产品推荐

