python変数のスコープ


いくつかの概念:
  • pythonが変数のスコープを変更できるコードセグメントはdef、class、lamdaである。
  • if/elif/else、try/except/finally、for/whileは変数の作用領域の変更に関連していません。つまり、彼らのコードブロックの変数は、外部でもアクセスできる
  • です。
  • 変数検索パスは、ローカル変数->グローバル変数
  • です。
  • pythonが変数のスコープを変更できるコードセグメントはdef、class、lamdaである。
  • def scopetest():
        localvar=6;
        print(localvar)
      
    scopetest()
    #print(localvar) #         ,  localvar     
  • if/elif/else、try/except/finally、for/while
  • 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です。彼を使います。