全局帧与堆栈帧

时间:2016-08-13 23:05:24

标签: python python-2.7 stack global stack-trace

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

这是some code

Here's some code:

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

Here's what the author describes as the "global frame" and the "stack frames" at the current point of execution for the above code

我的问题:“全局框架”与“堆叠框架”之间有什么区别?这个术语是否正确(我用Google搜索并获得了各种不同的答案)?

1 个答案:

答案 0 :(得分:6)

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将全局框架称为名为<module>的函数,如上例(function='<module>')或错误中所示:

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

&#34;全球&#34;之间唯一真正的区别和&#34;功能&#34;帧是全局帧没有区分全局变量和局部变量:

>>> my_frame.f_globals is my_frame.f_locals
True

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