全局帧与堆栈帧

tha*_*nce 4 python stack global stack-trace python-2.7

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

这是一些代码

这是一些代码:

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

以下是作者在上述代码的当前执行点描述的

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

Tad*_*sen 7

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
Run Code Online (Sandbox Code Playgroud)

全局帧与本地帧没有什么特别之处 - 它们只是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)]
Run Code Online (Sandbox Code Playgroud)

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

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

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

"全球性"和"功能"帧之间唯一的区别是,随着全球框架存在全局和局部变量之间没有区别:

>>> my_frame.f_globals is my_frame.f_locals
True
Run Code Online (Sandbox Code Playgroud)

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