以下はすべて、メインページwww.pythontutor.com(途中で素晴らしいツールとウェブサイト)からです。グローバルフレームとスタックフレーム
:はここでここで著者は、上記のコードの実行の現在の時点では、「グローバルフレーム」と「スタックフレーム」として説明するものですsome code
です
私の質問:「グローバルフレーム」と「スタック」の違いは何ですか? kフレーム "?この用語は正しいですか(私はグーグルグーグルで、さまざまな答えを得ました)?
以下はすべて、メインページwww.pythontutor.com(途中で素晴らしいツールとウェブサイト)からです。グローバルフレームとスタックフレーム
:はここでここで著者は、上記のコードの実行の現在の時点では、「グローバルフレーム」と「スタックフレーム」として説明するものですsome code
です
私の質問:「グローバルフレーム」と「スタック」の違いは何ですか? kフレーム "?この用語は正しいですか(私はグーグルグーグルで、さまざまな答えを得ました)?
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は(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
にする必要があります。しかし、それ以外の場合、すべてのフレームはかなり同等です。
"グローバルフレーム"は、グローバルスコープのフレームであるため、そのフレームを示す名前のように見えます。実行している関数に基づいてフレームにラベルを付けると、これはかなり一般的です。 _グローバルフレームはスタックフレームです。通常、実際に探している相違点はわかりません。 –
@ TadhgMcDonald-Jensenそれでは、グローバルフレーム*はグローバルスコープのスタックフレームで、他の*スタックフレーム*はさまざまなローカルスコープのフレームです。 –
(比喩)すべての正方形は長方形ですが、すべての長方形が正方形であるとは限りません。すべての「グローバルフレーム」はスタック内のフレーム(「スタックフレーム」)ですが、スタック内のすべてのフレームがグローバルスコープに結び付けられているわけではありません。単一のモジュールでは、 "グローバルスタック"をはるかに異なるものと考えるのは簡単ですが、実際には唯一の違いは 'ローカル 'を'グローバル'と同じように扱うことです –