Python のスコープルールとは正確には何ですか?
コードがある場合:
code1
class Foo:
code2
def spam.....
code3
for code4..:
code5
x()
はどこにx
ありますか? 考えられる選択肢としては、以下のリストがあります。
- 囲んでいるソースファイル内
- クラス名前空間内
- 関数定義では
- forループのインデックス変数
- 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
) 内でグローバルに宣言されたものはありますか? x
B: Python の組み込み関数。