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
相关产品推荐
相关产品推荐

