全局框架与堆栈框架

Posted

技术标签:

【中文标题】全局框架与堆栈框架【英文标题】:global frame vs. stack frame 【发布时间】:2016-12-20 15:13:05 【问题描述】:

以下所有内容均来自www.pythontutor.com 的主页(顺便说一句,这是一个很棒的工具和网站)。

这里是some code

以下是作者描述的上述代码在当前执行点的“全局框架”和“堆栈框架”:

我的问题:“全局框架”和“堆栈框架”有什么区别?这个术语是否正确(我用谷歌搜索并得到了各种不同的答案)?

【问题讨论】:

"global frame" 看起来像它给该框架的名称,因为它是全局范围的框架,如果您根据它们正在执行的功能标记框架,这是相当常见的。 全局框架是一个堆栈框架通常位于最底部的那个不确定您真正在寻找什么差异。 @TadhgMcDonald-Jensen 那么说global frame是全局作用域的stack frame,其他stack frames是准确的吗?各种局部范围的框架? (比喻)每个正方形都是矩形,但不是每个矩形都是正方形。每个“全局框架”都是堆栈中的一个框架(“堆栈框架”),但并非堆栈中的所有框架都绑定到全局范围。对于单个模块,很容易将“全局堆栈”视为完全不同的东西,但实际上唯一的区别是它对待 localsglobals 相同 【参考方案1】:

TL 博士:

当你调用一个函数时,会为本地执行创建一个框架。

当一个模块被加载时,会为全局模块的执行创建一个框架。

python 导师不支持显示跨多个文件的执行,因此主模块的初始框架看起来很独特,但您可以想象语句 import foo 创建一个新框架来执行模块 foo就像调用函数创建执行这些函数的框架一样。


frames 是您可以与之交互的实际 Python 对象:

import inspect

my_frame = inspect.currentframe()

print(my_frame) #<frame object at MEMORY_LOCATION>

print(my_frame.f_lineno) #this is line 7 so it prints 7
print(my_frame.f_code.co_filename) #filename of this code executing or '<pyshell#1>' etc.
print(my_frame.f_lineno) #this is line 9 so it prints 9

全局框架与局部框架并没有什么特别之处——它们只是执行stack中的框架:

Python 3.6.0a1 (v3.6.0a1:5896da372fb0, May 16 2016, 15:20:48) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import inspect
>>> import pprint
>>> def test():
...     pprint.pprint(inspect.stack())
... 
>>> test() #shows the frame in test() and global frame
[FrameInfo(frame=<frame object at 0x1003a3be0>, filename='<stdin>', lineno=2, function='test', code_context=None, index=None),
 FrameInfo(frame=<frame object at 0x101574048>, filename='<stdin>', lineno=1, function='<module>', code_context=None, index=None)]
>>> pprint.pprint(inspect.stack()) #only shows global frame
[FrameInfo(frame=<frame object at 0x1004296a8>, filename='<stdin>', lineno=1, function='<module>', code_context=None, index=None)]

当你调用一个函数(用 python 源代码定义)时,它会为它的本地执行添加一个框架到堆栈中,当一个模块被加载时,一个用于模块全局执行的框架被添加到堆栈中。

框架没有任何标准化的命名约定,因此互联网上的术语可能会相互矛盾。通常您可以通过文件和函数名来识别它们。 Python 将全局框架称为一个名为 &lt;module&gt; 的函数,如上例 (function='&lt;module&gt;') 或错误中所示:

>>> raise TypeError
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    raise TypeError               # ^ up there
TypeError
                               

“全局”和“功能”框架之间唯一真正的区别在于,全局框架没有全局变量和局部变量之间的区别:

>>> my_frame.f_globals is my_frame.f_locals
True

这就是为什么将 global 关键字放在全局框架中没有意义的原因,它表明变量名称 - 在分配时 - 应该放在 .f_globals 而不是 .f_locals 中。但除此之外,所有帧都几乎相同。

【讨论】:

以上是关于全局框架与堆栈框架的主要内容,如果未能解决你的问题,请参考以下文章

框架 day65 Mybatis入门(基础知识:框架原理,入门[curd],开发dao层,全局与映射配置)

java当局部变量与全局变量同名时,源码+原理+手写框架

如何全局导入 Swift 框架?

java框架之mybatis

小程序03/ uni-app自定义全局组件 uni-app项目引入 Uview-ui 框架教程方法 和 Uview框架介绍

如果我在实体框架中全局禁用 ProxyCreation 会有啥后果?