TIL #45 : [Python] Scope
Scope
画像ソース
scopeは、あるオブジェクト(関数、変数など)の意味のある範囲を表します.範囲外の場合は、このオブジェクトは使用できません.
Pythonでは、scopeは常にオブジェクト宣言ポイントから上までのすべてのサブオブジェクトとその範囲です.
scopeには4つの範囲があります
Local Scope
Local Scopeを持つ変数、関数、またはオブジェクトは、特定の範囲内でのみ有効です.通常、関数に宣言された変数または関数にはlocalscopeがあり、これらの変数はこの関数でのみ有効です.
coffee
は、my_function
関数における局所的役割ドメイン変数である.すなわち,my_function
関数外でprint(coffee)
を試みるとNameError
が現れる.Enclosing Scope
Enclost Scopeは、オーバーラップ関数がある場合に適用されるscopeです.親関数で宣言された変数は、オーバーラップ関数でも有効です.
my_function
関数には、other_function
という関数が宣言されています.ここで、water
はother_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
Reference
この問題について(TIL #45 : [Python] Scope), 我々は、より多くの情報をここで見つけました https://velog.io/@mjhuh263/TIL-45-Python-Scopeテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol