python変数のスコープ
いくつかの概念: pythonが変数のスコープを変更できるコードセグメントはdef、class、lamdaである。 if/elif/else、try/except/finally、for/whileは変数の作用領域の変更に関連していません。つまり、彼らのコードブロックの変数は、外部でもアクセスできる です。変数検索パスは、ローカル変数->グローバル変数 です。 pythonが変数のスコープを変更できるコードセグメントはdef、class、lamdaである。 if/elif/else、try/except/finally、for/while
このキーワードに変数が定義されていますが、彼らの作用域は外部と一致しています。これはJavaの作用域概念とはちょっと違っています。変数検索パスは、ローカル変数->グローバル変数 です。
ここでvarがまず検索するのはローカル変数です。scopetest()のvar=6は自分が定義した局所変数に相当します。6に割り当てられます。もちろんグローバル変数の値を修正するには、次のような必要があります。
もう一つこのような状況を見ます。
呼び出し順序によって逆検索します。まずローカル変数からグローバル変数、例えばinnerFunでローカル変数を検索します。いいえ、いいです。呼び出し関係の前の段階のscopetestを探してみます。ローカル変数var=6を見つけたら、OKです。彼を使います。
def scopetest():
localvar=6;
print(localvar)
scopetest()
#print(localvar) # , localvar
while True:
newvar=8
print(newvar)
break;
print(newvar)
try:
newlocal=7
raise Exception
except:
print(newlocal)#
出力結果:8 8 8 7このキーワードに変数が定義されていますが、彼らの作用域は外部と一致しています。これはJavaの作用域概念とはちょっと違っています。
def scopetest():
var=6;
print(var)#
var=5
print(var)
scopetest()
print(var)
出力結果:5 6 5ここでvarがまず検索するのはローカル変数です。scopetest()のvar=6は自分が定義した局所変数に相当します。6に割り当てられます。もちろんグローバル変数の値を修正するには、次のような必要があります。
def scopetest():
global var
var=6;
print(var)#
var=5
print(var)
scopetest()
print(var)
出力結果:5 6もう一つこのような状況を見ます。
def scopetest():
var=6;
print(var)#
def innerFunc():
print(var)#look here
innerFunc()
var=5
print(var)
scopetest()
print(var)
出力結果:5 6 6 5呼び出し順序によって逆検索します。まずローカル変数からグローバル変数、例えばinnerFunでローカル変数を検索します。いいえ、いいです。呼び出し関係の前の段階のscopetestを探してみます。ローカル変数var=6を見つけたら、OKです。彼を使います。