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.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:
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)?
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.