You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:06:05