以下所有内容均来自www.pythontutor.com的主页(顺便说一句,这是一个出色的工具和网站)。
以下是作者在上述代码的当前执行点描述的“全局框架”和“堆栈框架”:
我的问题:“全局框架”与“堆叠框架”之间有什么区别?这个术语是否正确(我用Google搜索并获得了各种不同的答案)?
答案 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
中。但除此之外,所有帧都非常相同。