Python中if/elif条件分支内如何正确使用全局变量?
问题原因
- 你的
a()函数中第一个判断条件5 == 5恒为真,代码进入该分支完成x赋值后就直接return True退出函数,后续的elif分支永远不会被执行,global y声明和y = 3的赋值逻辑从未运行,全局作用域中不存在y变量,b()函数读取y时就会触发未定义报错。 - 即使后续调整了分支判断逻辑,只要存在某次运行没有走到声明
global y的分支的可能,同样会出现这个报错,本质是全局变量的声明和赋值绑定在了分支逻辑上,没有保证全局变量必然被创建。
修复方案
方案1:提前初始化全局变量
在代码最顶部先给所有需要用到的全局变量设置初始值,保证全局作用域中必然存在对应变量:
# 提前初始化全局变量,默认值可按业务需求调整 x = 0 y = 0 def a(): global x if 5 == 5: x = 39 return True elif 6 == 6: global y y = 3 return True def b(): if x == 3: print("ok") elif y == 3: print("no") a() b()
方案2:统一声明全局变量,给分支变量设置默认值
在a()函数开头统一声明所有要用到的全局变量,同时给所有变量赋初始值,避免分支遗漏:
def a(): # 开头统一声明所有全局变量 global x, y x = 0 y = 0 if 5 == 5: x = 39 return True elif 6 == 6: y = 3 return True def b(): if x == 3: print("ok") elif y == 3: print("no") a() b()
方案3(推荐):避免使用全局变量,改用返回值传递数据
全局变量本身存在状态不可控的问题,改用函数返回值传递参数会更稳妥:
def a(): if 5 == 5: return {"x": 39} elif 6 == 6: return {"y": 3} def b(data): x = data.get("x", 0) y = data.get("y", 0) if x == 3: print("ok") elif y == 3: print("no") a_ret = a() b(a_ret)
内容的提问来源于stack exchange,提问作者Trees Jin
相关产品推荐
相关产品推荐

