Python函数内定义变量后仍报NameError的原因是什么?
报错原因
这个错误是Python变量作用域规则导致的:
- 函数内部默认定义的变量都是局部变量,仅在函数运行的生命周期内有效,函数执行结束后局部变量就会被销毁,无法在函数外部直接访问。
- 你代码里的
net_affect是在na()函数内部定义的局部变量,虽然调用na()时你能看到它打印出了3.0的计算结果,但函数运行结束后这个变量已经被回收,后续if判断语句在全局作用域中找不到名为net_affect的变量,因此抛出NameError。
修复方案
推荐使用函数返回值的方式传递计算结果,这也是Python中函数间传值的标准做法,修改后的代码如下:
h, m, s, t = input('Rate each of the following Emotions and hit enter:\nHappiness (1-7):'), input('Meaningfulness (1-7):'), input('Stressfulness (1-7):'), input('Tiredness (1-7):') h_int=int(h) m_int=int(m) s_int=int(s) t_int=int(t) def na(): add_h_m = h_int + m_int div_h_m = add_h_m/2 add_s_t = s_int + t_int div_s_t = add_s_t/2 net_affect = div_h_m - div_s_t print(net_affect) # 新增返回语句,把计算结果传递到函数外部 return net_affect # 调用函数时,用变量接收返回的计算结果 net_affect = na() if net_affect >= 3: print("Doing Well") elif 0 < net_affect < 3: print("Doing Okay") else: print("Not Good")
也可以通过声明全局变量的方式解决,但不推荐:
def na(): # 声明net_affect为全局作用域变量,函数内部修改会同步到全局 global net_affect add_h_m = h_int + m_int div_h_m = add_h_m/2 add_s_t = s_int + t_int div_s_t = add_s_t/2 net_affect = div_h_m - div_s_t print(net_affect)
提示:全局变量会提升代码的调试和维护成本,多场景修改全局变量很容易出现不可预期的问题,非必要不要使用。
内容的提问来源于stack exchange,提问作者Mary Rachel
相关产品推荐
相关产品推荐

