python踩坑之exec变量作用域
摘要:最近在使用exec函数时发现exec这个东西十分神奇。
exec的变量作用域
函数的定义(查看python文档):
这两个参数可以用来指定执行代码时可以使用的全局变量和局部变量, 以及收集执行代码后的全局变量和局部变量。
- globals 默认为 globals()
locals 默认为 本地局部变量 locals的值。
下面将举例说明指定 globals 和 locals 变量时的效果。
(1)当未设置globals 和 locals时,使用默认作用域
当未指定a为global变量时a=a+1会在exec内创建一个,名叫"a"的局部变量。可以用id(a)查看。
当指定a为global变量时a=a+1会使用全局变量。
字典等因为是引用,所以会影响外面的值
(2)当设置globals 时,locals的值默认为globals的值
当设置globals 时,locals的值默认为globals的值,此时exec内只能使用globals字典内部的变量。对变量的修改也会反映到globals字典里,不会影响到外界。
可以看到locals的值默认为globals的值
(3)当同时设置了globals和locals的值时
此时先检测变量是否在locals中存在,如果在locals中不存在就创建一个。可以看到locals中创建一个键名叫a的值。
(4)遇到一个神奇的问题
下面的代码不能正常运行:
而下面的代码能运行:
问题出在
这一行代码上具体问题还是查不出来。
解决办法:
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
创建class时,使用self.xxx等同于exec中globals(),如果在exec使用了self,那么后续这个self.xxx在整个class里都是有效的,
谢谢