堆栈框架和作用域之间的关系是什么



最近我正在学习Python中的作用域。我理解什么是堆栈框架,但我对堆栈框架和范围之间的关系和区别感到困惑。我通过《使用Python进行计算和编程导论》一书学习Python。它没有具体阐明这两个术语。

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

这种排序是"阴影化"的原因:如果您在局部作用域中定义某个内容,它会阴影化全局,因为在全局作用域之前会检查局部作用域。该定义不会覆盖前一个变量,而是对其进行阴影处理。如果在同一范围内重新定义变量,则会覆盖前一变量,并且无法将其取回。

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

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

最新更新