2

質問とほぼ同じローカル、グローバル、静的、自動、レジスタ、外部、定数、揮発性変数はどこに保存されますか?、違いは、このスレッドがPython言語がこれをどのように実装するかを尋ねていることです。

4

1 に答える 1

6

これらすべてのうち、Python には「ローカル」、「グローバル」、および「非ローカル」変数しかありません。

それらのいくつかは、辞書または辞書のようなオブジェクトに格納され、通常は明示的にアドレス指定できます。

"global" : 実際には、"global" 変数は、それらが定義されているモジュールに対して相対的にグローバルです。C でグローバル変数を使用することのほとんどの問題は適用されないため、グローバルではなく "モジュール レベル" 変数と呼ばれることもあります。モジュールレベルのグローバル変数を使用すると、名前の競合も発生せず、特定の名前が由来するかどうかもわかりません。

それらの値は、モジュール オブジェクトの "__dict__" 属性として利用可能な辞書に格納されます。モジュール内のすべての名前がこの方法で保存されることに注意することが重要です。Python の名前はあらゆる種類のオブジェクトを指しているためです。つまり、言語レベルでは「変数」、関数、クラスの区別はありません。モジュール: これらすべてのオブジェクトの名前は、言語によって直接アクセスされる "__dict__" 特殊属性のキーになります。はい、通常の「setattr」を使用して、実行時にモジュール内の変数が指すオブジェクトを挿入または変更するか、モジュールの __dict__ を直接変更することさえできます。

"local" : ローカル変数は、"locals()" 組み込み関数呼び出しによって返されるディクショナリ内の "ユーザー コード" で使用できます。このディクショナリは、実行中の現在のコード フレームの「f_locals」属性によって参照されます。現在実行中のコードを呼び出した関数のコード フレームを取得する方法があるため、f_locals 属性を使用してそれらの関数で使用可能な変数の値を取得できますが、CPython 実装では、f_locals 辞書の値を変更することはできません。実行中のコードの実際の変数値を反映します。これらの値は、バイトコード機構によってキャッシュされます。

「非ローカル」変数は、関数内で定義された関数 (またはクラス本体などの他のコード) の場合、関数内で、外側のスコープで定義された変数への特別な参照です。それらは、「セル」オブジェクトのタプルである func_closure 属性を取得することにより、実行中のコードで取得できます。たとえば、関数オブジェクト内の最初の非ローカル変数の値を取得するには、次のようにします。_ function.func_closure[0].cell_contents- 値は変数名とは別に保持され、 として取得できますfunction.func_code.co_varnames。(この命名スキームは Python 2.x で有効です)

結論: 変数の「値」は、Python オブジェクトと互換性があり、仮想マシンによって管理されるオブジェクト内に常に保持されます。これらのデータの一部は、イントロスペクションを通じてプログラムでアクセスできるようにすることができますが、一部は不透明です。(たとえば、イントロスペクションを通じて、それらを所有する関数内から非ローカル変数を取得するのは少し注意が必要です)

于 2012-02-20T16:30:16.267 に答える