「Test」と「test」が参照されているので、関数の最初の 2 行でも例外はないと思います。
正しい。var
また、定義したグローバル属性ではなく、クラス属性を参照します。
メンバー「var」が割り当てられていますが、「Test」と「test」はメンバーを取得するために参照されるため、グローバルです。
別の言い方をTest
すれtest
ば、グローバル名前空間で利用できるのでTest.var
、test.var
機能します。
の値がvar
で変更されていない場合は、その上の行でグローバルではなくクラス属性sum()
が変更されているため、0 が返されます。Test
合計にいくつかの s を追加print
して削除するvar += 1
def sum():
Test.var += 1
print Test.var
test.var += 1
print test.var
print var
sum()
...与えます:
1
2
0
しかし、sum 関数内で var に値を代入しようとすると、その行の前でもエラーが発生します。
>>> def sum():
... Test.var += 1
... print Test.var
... test.var += 1
... print test.var
... print var
... var += 1
... print var
...
>>> sum()
1
2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in sum
UnboundLocalError: local variable 'var' referenced before assignment
var
は現在 sum() で値が割り当てられているため、ローカルと見なされますが、その行より前に定義されていません。(これは、python が「先読み」またはvariable scope
sum() でチェックを行っていることを意味します。これは、再割り当てさprint var
れる前に最初のエラーが発生したためです。代わりに置くと、同じエラーが発生します。)var
var = 50
var += 1
グローバル変数を操作するには:
def sum():
Test.var += 1
print Test.var
test.var += 1
print test.var
global var #added the global keyword
print var
var += 1
print var
出力:
1
2
0 # notice that global var is still 0 because the above var+=1 are for Test.var
1
編集:私が言及した「先読み」動作について。それについて質問を投稿する予定でしたが、この回答でよく説明されています: https://stackoverflow.com/a/370380/1431750 (to Python variable scope error )