TIL #45 : [Python] Scope


Scope



画像ソース
scopeは、あるオブジェクト(関数、変数など)の意味のある範囲を表します.範囲外の場合は、このオブジェクトは使用できません.
Pythonでは、scopeは常にオブジェクト宣言ポイントから上までのすべてのサブオブジェクトとその範囲です.
scopeには4つの範囲があります
  • local scope
  • enclosed scope
  • global scope
  • built-in scope
  • build-inの範囲が最も広い.

    Local Scope


    Local Scopeを持つ変数、関数、またはオブジェクトは、特定の範囲内でのみ有効です.通常、関数に宣言された変数または関数にはlocalscopeがあり、これらの変数はこの関数でのみ有効です.
    coffeeは、my_function関数における局所的役割ドメイン変数である.すなわち,my_function関数外でprint(coffee)を試みるとNameErrorが現れる.

    Enclosing Scope


    Enclost Scopeは、オーバーラップ関数がある場合に適用されるscopeです.親関数で宣言された変数は、オーバーラップ関数でも有効です.
    my_function関数には、other_functionという関数が宣言されています.ここで、waterother_function関数でしか使用できないlocalscopeである.したがって,print(water)other_function関数の外で宣言できないため,NameErrorが出現した.
    ただし、coffeeは、other_functionの親関数my_functionに宣言された変数であり、閉鎖scopeとして使用することができる.このため、7列目に発表されたprint(f'{water}, {coffee}')は正常に300 ml、500 mlに出力される.

    Global Scope


    Global scopeは、関数外宣言ではなく、関数内で宣言される変数です.Global scopeは最外部で宣言されているので、ファイルで宣言されたポイントの下にすべての内容を書き込むことができます.
    milkは世界的な範囲であるため、「other function`」にも適用できる.

    Built-in Scope


    最も明るいscopeは、build-inscopeを持つPythonに内蔵されたPythonが提供する関数です.すなわち,別途宣言しなくても,すべてのPythonファイルに有効範囲がある.len()関数はbuild-in範囲です.

    Shadowing


    変数または関数の定義が見つかった場合、Pythonは次の順序のScopeで検索されます.
    local scope -> enclosed scope -> global scope -> built-in scope
    最も狭い有効範囲から、最も広い範囲に向かいます.同じ名前の変数が異なるscopeで宣言されると、より狭い範囲に隠された変数のshadowing効果も発生します.
    my_function関数のmilk`` 변수가 아닌 global scope으로 선언된 牛乳``変数値を出力します.

    Changing Vars to 'global'


    関数でグローバル変数の値を変更するには、グローバルキーを使用します.
    x = 10          # 전역 변수
    def foo():
        global x    # 전역 변수 x를 사용하겠다고 설정
        x = 20      # x는 전역 변수
        print(x)    # 전역 변수 출력
     
    foo()
    print(x)        # 전역 변수 출력
    出力:
    20
    20
    関数にグローバル変数がない場合にglobalを使用すると、その変数はグローバル変数になります.
    # 전역 변수 x가 없는 상태
    def foo():
        global x    # x를 전역 변수로 만듦
        x = 20      # x는 전역 변수
        print(x)    # 전역 변수 출력
     
    foo()
    print(x)        # 전역 변수 출력
    コードソース

    ネーミングスペース


    Pythonでは、変数はネーミングスペース(ネーミングスペース)に格納されます.locals()関数により、ネーミングスペースをバイナリ形式で出力できます.

    最後のディクソン要素として追加されました!
    Reference:
    https://dojang.io/mod/page/view.php?id=2364