본문 바로가기

프로그래밍/python

[python] Scope(local, global, enclosing)

Local Scope
my_score = 50
def inside_value_function():
    my_score = 80
    print(f"my score inside is {my_score}")
  • 함수 내는 새로운 Name Space를 만들기에, 새로운 변수를 만들면 바깥 변수랑 다른 변수가 생성됨. 
  • 이 변수는 함수가 호출될 때 생성되고, 함수 실행이 끝나면 소멸됨. 
Global Scope
my_score = 50
def inside_value_function():
    global my_score
    my_score = 80
    print(f"my score inside is {my_score}")
  • global 선언한 외부 변수 값을 바꿀 수 있음.
  • global을 선언하면 함수 내의 global 변수는 바깥(global name space)의 global 변수에 접근(사용)함.
Enclosed/Enclosing Scope
def a():
    x = 10 # global x
    def b():
        nonlocal x 
        x = 20 # local x
    b()
    print(x)
  • nonlocal은 (Local을 제외한) 가장 가까이 있는 변수(Enclosing)를 사용하도록 함.
  • 클로저(Closure) 구조에서 내부 함수(b)가 외부 함수(a)의 변수(x = 10)에 접근하고 값을 변경할 때 사용. 
  • nonlocal x 선언 안하면, local 변수 x(x=20)은 enclosing 변수 x(x=10) 에 영향을 주지 않고 소멸됨. 

+ 추가 설명 1 : Name Space
  • 개념 : 이름(변수명, 함수명 등)과 실제 객체(데이터)를 연결하는 맵핑(Mapping) 시스템
  • 현재 스코프의 Name Space에서 시작하여 LEGB의 순서대로 탐색함. 
  • 함수를 만들면 함수 내 새로운 Name Space가 만들어진다. 
  • if 문, while 루프, for 루프 등의 제어문은 Name Space를 만들지 않는다. 
+ 추가 설명 2: LEGB rule (python이 변수를 찾는 우선순위) 
  1. L : local : 현재 작업 중인 함수 내부(가장 먼저 찾음)
  2. E : enclsing : 현재 함수를 둘러싸고 있는 다른 함수(클로저). 
  3. G : global : 모듈 전체(파일)의 최상단 스코프.
  4. B : built-in : 파이썬이 기본적으로 제공하는 내장 함수나 상수의 스코프
+ 추가 설명 3: Global Constant
  • print(globals()) : 현재 모듈(파일)의 전역 네임스페이스를 담고 있는 딕셔너리(dictionary)를 반환
  • Global variable 사용 목적 : 반복하여 사용하는 Global Constant를 지정해 두고 불러와 사용
  • 관례 : 모든 문자를 대문자로 작성하고, 단어 사이는 밑줄(_)로 구분함.
    • 해당 변수의 값은 변경하지 말하야 할 상수임을 나타냄.
    • 예: MAX_SIZE, PI_VALUE

 

-------------------------------------------------------------------------------

참고 : 실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지 (inflearn, 미쿡엔지니어) 

-------------------------------------------------------------------------------

'프로그래밍 > python' 카테고리의 다른 글

[python] Class Construct(__init__)  (0) 2025.12.12
[python] Pypi (pip install)  (0) 2025.12.12
[python] Common Coding Mistakes  (0) 2025.12.09
[python] Docstrings(String Literal)  (0) 2025.12.09
[python] Assignment vs Shallow vs Deep Copy  (0) 2025.12.07