1. ホーム
  2. python

[解決済み] スコーピングルールの簡単な説明?

2022-03-21 21:07:34

質問事項

まさに は、Pythonのスコーピングルールですか?

コードがあれば

code1
class Foo:
   code2
   def spam.....
      code3
      for code4..:
       code5
       x()

はどこですか? x が見つかりましたか? 考えられるのは、以下のリストです。

  1. 付属のソースファイル内
  2. クラスの名前空間内
  3. 関数定義内
  4. forループのインデックス変数に
  5. forループの内部

また、実行中のコンテキストがあり、関数 spam がどこかに渡される。また、もしかしたら ラムダ関数 は少し違った形で渡すのでしょうか?

どこかに簡単なリファレンスやアルゴリズムがあるはずです。 Pythonの中級プログラマーにとっては、混乱の世界です。

どのように解決するのか?

実は、PythonのScope解決のための簡潔なルールは、以下の通りです。 ラーニングPython, 3rd. Ed. . (これらのルールは属性ではなく、変数名に特有のものです。ピリオドなしで参照した場合、これらのルールが適用されます)。

LEGBルール

  • L ocal - 関数内で任意の方法で割り当てられた名前 ( def または lambda ) で、その関数の中でグローバルに宣言されていない

  • E nclosing-function - 静的に囲まれているすべての関数のローカルスコープに割り当てられた名前 ( def または lambda ) 、内側から外側へ

  • G lobal (module) - モジュールファイルのトップレベルで割り当てられる名前、または global 文の中で def ファイル内の

  • B uilt-in (Python) - 組み込み名モジュールであらかじめ割り当てられている名前。 open , range , SyntaxError など

ということで

code1
class Foo:
    code2
    def spam():
        code3
        for code4:
            code5
            x()

for ループは独自の名前空間を持っていません。LEGB順に並べると、スコープは次のようになります。

  • L:ローカルで def spam (この code3 , code4 および code5 )
  • E: 囲む関数 (例全体が別の def )
  • G:何かありましたか? x モジュール内でグローバルに宣言された( code1 )?
  • B: 任意のビルトイン x をPythonで作成します。

x は絶対に見つかりません。 code2 (期待されるような場合でも Anttiの回答 または こちら ).