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

2024-01-07

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


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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

栈帧和作用域之间有什么关系? 的相关文章

随机推荐