Python中exec函数传入空字典作为locals参数时的工作机制解析
exec() 传入locals字典的原理解析
先看你运行的代码:
c = '''x = 1 def __init__(self,n):self.name = n def printD(self):print(self.name)''' d = {} print(d) exec(c,globals(),d) print(d)
核心逻辑:exec() 直接复用你传入的locals字典
当你给exec()第三个参数(也就是locals)传了字典d,Python就不会再新建临时的本地作用域,而是把这个字典当作代码块执行时的本地命名空间来用。
代码块里所有的赋值操作、函数定义,都会直接写入这个字典:
- 变量
x = 1会在d里添加键'x',对应值1 - 定义的
__init__函数,会以函数对象为值存入d的'__init__'键下 - 定义的
printD函数,会以函数对象为值存入d的'printD'键下
这就是为什么执行完exec()后,原本空的d会被填满——它就是代码块运行时的本地命名空间载体。
和默认行为的区别
如果不传第三个locals参数,exec()会使用当前上下文的本地命名空间,但由于Python对函数内的本地变量做了优化,这些修改无法被外部获取到。而手动传入字典的方式,相当于强制把代码块的本地变量暴露到你指定的容器里。
内容的提问来源于stack exchange,提问作者user1994249
相关产品推荐
相关产品推荐

