- 上图是代码开始执行,但还没有执行第一句的情况
- 从左上方区域可以看到2个变量,locals 和 globals , 左下方看到调用堆栈列表(每一项我称为"frame")
- locals 和 globals 都以字典的形式保存数据,而字典的 key 就是一些变量名字
- 调用堆栈列表中,第一行就是当前执行作用域, 是模块的意思
- 其实 locals 和 globals 字典都来自于 frame
- 在执行模块代码之前,Python 会做一些准备,比如一些内置函数,这些会保存在 frame 中的 builtins 字典中
接下来执行第一句代码后:
- 当我们定义一个变量,那么就会把变量信息设置到当前 frame 的 locals 字典里面
- **而 python 在初始化模块 frame时,会把 locals 与 globals 设置成同一个字典,此时 locals 和 globals 都可以看到 a 变量的信息 **
继续执行:
- 定义函数,本质上就是定义了变量,所以上面的结果在意料之内
接下来,将要调用刚刚定义的函数:
- 此时,Python 要找到名字叫 changeA 的变量,然后调用他。但是,怎么找?
- 规则很简单, 从当前 frame 的 locals 找,如果找不到则从 globals 找,如果找不到,最后到 buildins 找
- 显然,这里从 locals 里面就可以找到
现在代码执行进入到函数里面: