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

Python类方法中使用exec函数无法赋值的问题解决

问题解决:exec在类方法中无法修改局部变量的问题

先看全局作用域下可正常运行的代码:

name = "Test"
myname = ""
exec('myname ="' + name + '"')
print(myname)

运行结果:

Test

但将相同逻辑放到类的方法中时,输出却是空字符串:

class new(object):
    def __init__(self, name):
        self.print(name)

    def print(self, name):
        myname = ""
        exec('myname ="' + name + '"')
        print(myname)

a = new("My name")

原因

Python函数(包括类的方法)的局部变量是编译阶段就确定好的,exec属于运行时动态执行的代码,它的赋值操作无法被解释器识别为当前函数局部变量的修改——简单说,exec里的myname和方法里定义的myname不在同一个作用域,所以方法里的myname始终是初始的空字符串。而全局作用域没有这个限制,exec可以直接修改全局变量。

解决方案

因为必须使用exec,所以可以通过自定义作用域字典来让exec的变量能被外部获取:

修改后的类代码:

class new(object):
    def __init__(self, name):
        self.print(name)

    def print(self, name):
        # 创建自定义字典,作为exec的局部作用域
        local_scope = {}
        # 将自定义字典传给exec,第三个参数指定局部作用域
        exec('myname ="' + name + '"', globals(), local_scope)
        # 从字典中取出exec赋值后的变量
        print(local_scope['myname'])

a = new("My name")

运行后会输出My name,和全局作用域的效果一致。

补充说明:不要直接用locals()作为exec的局部作用域,Python3里locals()返回的字典是只读的,修改后不会同步到实际的局部变量,自定义字典是最可靠的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:35:23