global frame vs. stack frame

Tudo Abaixo é da página principal de www.pythontutor.com (uma ferramenta fantástica e um site a propósito).

Aqui está um código.

Here's some code:

Aqui está o que o autor descreve como o "quadro global" e os "quadros de pilha" no ponto actual de execução para o código acima:

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

minha pergunta: Qual é a diferença entre "quadro global" e "quadro de pilha"? Ser terminologia até mesmo correto (eu pesquisei no Google e obtive todos os tipos de respostas diferentes)?

Author: Tadhg McDonald-Jensen, 2016-08-14

1 answers

frames são objectos python reais com os quais pode interagir:

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
Não há nada de especial num quadro global contra um quadro local - são apenas quadros no stack de execução:
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)]

Quando alguma vez invocar uma função (definida com o código-fonte python), ela irá adicionar uma moldura para a sua execução local à pilha, quando algum módulo for carregado, uma moldura para a execução global do módulo é adicionada à pilho.

Os quadros não têm nenhuma convenção de nomes padronizada, Por isso a terminologia na internet provavelmente vai contradizer. Normalmente você pode identificá-los pelo nome do arquivo e função. Python refere-se a Molduras globais como sendo uma função chamada <module> Como pode ser visto no exemplo acima (function='<module>') ou em erros:
>>> raise TypeError
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    raise TypeError               # ^ up there
TypeError

A única diferença real entre os quadros" globais "e" funções " é que comquadros globais não há nenhuma distinção entre global e variáveis locais:

>>> my_frame.f_globals is my_frame.f_locals
True

É por isso que colocar a palavra - chave global no quadro global não tem sentido, indica nomes de variáveis que - quando atribuídos-devem ser colocados em .f_globals em vez de .f_locals. Mas, além disso, todas as molduras são praticamente iguais.

 5
Author: Tadhg McDonald-Jensen, 2017-06-01 20:00:06