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

在Python函数内使用exec触发NameError错误,求解决方案

问题分析与解决

在函数内部使用exec时出现NameError,核心原因是Python函数的局部作用域是编译时确定的,exec属于运行时动态执行代码,无法将动态创建的变量注入到函数已编译好的局部命名空间中,因此函数后续代码无法直接访问到exec里定义的upval1和upval2。

解决方案1:通过指定exec的命名空间字典获取变量

可以手动创建一个字典作为exec的局部命名空间,执行后从该字典中提取变量:

def func1(val1, val2):
    return val1*10, val2*10

def func2():
    val1 = 10
    val2 = 20
    # 创建字典传入exec,包含需要用到的变量和函数
    exec_namespace = {'val1': val1, 'val2': val2, 'func1': func1}
    exec('upval1, upval2 = func1(val1, val2)', exec_namespace)
    # 从字典中取出执行后生成的变量
    upval1 = exec_namespace['upval1']
    upval2 = exec_namespace['upval2']
    print('Updated value of val1=', upval1)
    print('Updated value of val2=', upval2)

func2()

也可以复用函数的locals()字典(注意:部分Python版本中修改locals()后需显式提取,无法直接通过变量名访问):

def func1(val1, val2):
    return val1*10, val2*10

def func2():
    val1 = 10
    val2 = 20
    local_vars = locals()
    exec('upval1, upval2 = func1(val1, val2)', globals(), local_vars)
    upval1 = local_vars['upval1']
    upval2 = local_vars['upval2']
    print('Updated value of val1=', upval1)
    print('Updated value of val2=', upval2)

func2()

解决方案2:避免使用exec(推荐)

你当前的场景完全不需要exec,直接调用函数即可,既安全又可读性强:

def func1(val1, val2):
    return val1*10, val2*10

def func2():
    val1 = 10
    val2 = 20
    # 直接调用函数获取返回值,无需exec
    upval1, upval2 = func1(val1, val2)
    print('Updated value of val1=', upval1)
    print('Updated value of val2=', upval2)

func2()

内容的提问来源于stack exchange,提问作者DumbCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:15:38