2016-08-13 3 views
2

以下はすべて、メインページwww.pythontutor.com(途中で素晴らしいツールとウェブサイト)からです。グローバルフレームとスタックフレーム

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

はここでここで著者は、上記のコードの実行の現在の時点では、「グローバルフレーム」と「スタックフレーム」として説明するものですsome code

Here's some code:

です

私の質問:「グローバルフレーム」と「スタック」の違いは何ですか? kフレーム "?この用語は正しいですか(私はグーグルグーグルで、さまざまな答えを得ました)?

+1

"グローバルフレーム"は、グローバルスコープのフレームであるため、そのフレームを示す名前のように見えます。実行している関数に基づいてフレームにラベルを付けると、これはかなり一般的です。 _グローバルフレームはスタックフレームです。通常、実際に探している相違点はわかりません。 –

+0

@ TadhgMcDonald-Jensenそれでは、グローバルフレーム*はグローバルスコープのスタックフレームで、他の*スタックフレーム*はさまざまなローカルスコープのフレームです。 –

+1

(比喩)すべての正方形は長方形ですが、すべての長方形が正方形であるとは限りません。すべての「グローバルフレーム」はスタック内のフレーム(「スタックフレーム」)ですが、スタック内のすべてのフレームがグローバルスコープに結び付けられているわけではありません。単一のモジュールでは、 "グローバルスタック"をはるかに異なるものと考えるのは簡単ですが、実際には唯一の違いは 'ローカル 'を'グローバル'と同じように扱うことです –

答えて

4

framesはあなたと対話することができ、実際のP​​ythonオブジェクトです:

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は(function='<module>')上記の例で、またはエラーに見られるように<module>という関数であるとして、グローバルフレームを指す:

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

「グローバル」と「機能」フレーム間の唯一の真の違いはということですなぜを入れている

>>> my_frame.f_globals is my_frame.f_locals 
True 

グローバルフレームでグローバルとローカル変数の間区別はありませんグローバルフレーム内のキーワードは無意味です。変数名は、割り当て時に.f_localsの代わりに.f_globalsにする必要があります。しかし、それ以外の場合、すべてのフレームはかなり同等です。

関連する問題