python - 栈帧和作用域之间有什么关系?

标签 python python-3.x

最近我正在学习 Python 中的作用域。我了解什么是堆栈框架,但我对堆栈框架和作用域之间的关系和区别感到困惑。我通过《Python计算与编程简介》这本书来学习Python。它没有具体阐明这两个术语。

最佳答案

范围只是 LEGB 之一:本地、封闭、全局和内置。它们是 Python 用于查找名称的命名空间。 LEGB 是执行查找的顺序,首先检查本地作用域中的名称,然后检查封闭作用域,然后检查全局作用域、内置作用域,如果从未找到,则最终会出现异常。

这种顺序是“遮蔽”的原因:如果您在本地范围内定义某些内容,它就会遮蔽全局,因为本地范围会在全局范围之前检查。该定义不会覆盖前一个定义,而是隐藏它。如果您在同一范围内重新定义变量,它将覆盖以前的变量,并且您无法将其恢复。

每次调用函数时都会创建一个堆栈帧(每次加载模块时都会创建一个全局帧)。堆栈帧处理函数的局部变量。每次调用另一个函数时,都会创建一个新的堆栈帧,从而创建一个新的局部作用域。这允许对函数的每次调用都有自己的一组局部变量,而无需访问先前调用的局部范围。每次函数返回时,该堆栈帧都会被销毁,并且最终会回到前一个堆栈帧(因此,它是一个“堆栈”)。

因此,“堆栈帧”与“作用域”相关,因为局部作用域位于最顶层的堆栈帧上。堆栈帧包含函数调用的本地范围,全局帧包含模块的全局范围。

关于python - 栈帧和作用域之间有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71646713/

相关文章:

Python:日期是否通过字符串逻辑

linux - Linux [Ubuntu 16.04]-为Anaconda Python3安装MATLAB引擎

python-3.x - 查找 torchvision 模型中的所有 ReLU 层

python - 在Python中读取文件并将其修改为副本

python - Scikit-learn - ValueError : Input contains NaN, 无穷大或对于 dtype ('float32' 的值太大)与随机森林

python - 为什么这个 JSON 数据无效?

python - 将列表中的每个第二个元素替换为其他列表中的每个第三个元素。

python - 使用 for 循环执行乘法变量的方法

python-3.x - 递归地从 N 中选择 K 个项目,直到为空

python websockets,如何设置连接超时