スコープルールの簡単な説明 質問する

スコープルールの簡単な説明 質問する

Python のスコープルールとは正確には何ですか?

コードがある場合:

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

はどこにxありますか? 考えられる選択肢としては、以下のリストがあります。

  1. 囲んでいるソースファイル内
  2. クラス名前空間内
  3. 関数定義では
  4. forループのインデックス変数
  5. forループ内

また、関数がどこか別の場所に渡される実行中のコンテキストもありますspam。そして、おそらくラムダ関数少し違ったやり方で渡しますか?

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

ベストアンサー1

実際、Pythonのスコープ解決の簡潔なルールは、Python を学ぶ、第 3 版(これらのルールは、属性ではなく変数名に固有のものです。ピリオドなしで参照する場合、これらのルールが適用されます。)

LEGBルール

  • ローカル— 関数 (defまたはlambda) 内で何らかの方法で割り当てられた名前で、その関数内でグローバルに宣言されていない名前

  • 囲みdef関数 — 静的に囲む関数(または)のローカルスコープ内でlambda内側から外側へ割り当てられた名前

  • グローバル(モジュール) — モジュールファイルの最上位レベルで割り当てられた名前、またはファイル内globalのステートメントを実行することによって割り当てられた名前def

  • 組み込み( 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) 内でグローバルに宣言されたものはありますか?
  • xB: Python の組み込み関数。

x決して見つからないcode2(見つかると予想される場合でも、アンティの答えまたはここ)。

おすすめ記事