- frame 列表上最顶层的 frame 将销毁
- 此时代码执行回到一开始的 module 的 frame 里面
当进入一个新的 frame, frame 会记录进入新 frame 前的代码行(实际上是字节码行),所以 python 可以在调用完一个函数后,在上次跳转的地方继续执行代码
总结一下上面的规则:
- 每当进入一个代码块,python 会创建一个 frame,frame 中的 locals、globals、builtins 属性可以查阅变量信息
- 查找一个变量的先后顺序是:locals > globals > builtins
- 如果是一个模块的 frame,其 locals 和 globals 是同一个字典
- 如果是非模块 frame,其 globals 与其上一层 frame 的 globals 是同一个字典,locals 是一个新字典
- 通过函数 globals 和 locals 可以获得的确 frame 的相关字典
举一反三
了解这些简单机制后,我们已经足以解释各种各样关于 python 变量的规则。
覆盖内置函数的本质:
- 行4-6:定义了函数 sum ,名字与内置函数一样了
- 行10:使用的时候真的变成我们自己的函数
- 行19:从 builtins 删除 sum
global 关键字的使用:
- global 关键字可以让我们在函数里面修改全局变量
其实约等价于:
- 行5:直接修改 globals 字典,同时避免在 locals 里面创建了变量
exec 的问题
回到 exec 的问题上,exec 是把参数1的代码作为一个模块 frame 执行: