コード1
x = 0
class Foo:
print(x)
x = 1
print(x)
print(x)
結果1
0
1
0
コード2
x = 0
def foo():
print(x)
x = 1
print(x)
foo()
結果2
UnboundLocalError: local variable 'x' referenced before assignment.
x
の2つの名前空間からオブジェクトを参照できるのはなぜclass block
ですか?なぜ投げないの
かわかりません。
関数とクラスの不一致が気になります。Code 1
UnboundLocalError
アップデート:
Python Docsを数回読んだ後でも、スコープのルールを理解できません。
ブロックは次のとおりです。モジュール、関数本体、およびクラス定義。...[スキップ]...
名前がブロックにバインドされている場合、非ローカルとして宣言されていない限り、その名前はそのブロックのローカル変数です。名前がモジュールレベルでバインドされている場合、それはグローバル変数です。(モジュールコードブロックの変数はローカルおよびグローバルです。)変数がコードブロックで使用されているが、そこで定義されていない場合、それは自由変数です。
名前バインディング操作がコードブロック内のどこかで発生した場合、ブロック内での名前の使用はすべて、現在のブロックへの参照として扱われます。これにより、名前がバインドされる前にブロック内で使用された場合にエラーが発生する可能性があります。このルールは微妙です。Pythonには宣言がなく、名前バインディング操作をコードブロック内のどこでも実行できます。コードブロックのローカル変数は、ブロックのテキスト全体をスキャンして名前バインディング操作を行うことで判別できます。