변수와 Scope
- 변수를 정의할 때, 정의된 변수가 사용할 수 있는 프로그램의 영역이 존재.
- 이 프로그램의 영역을 Scope라고 부르며, 변수명이 코드의 다른 부분에서 보이게 할지 결정.
- 코드에서 참조하는 변수가 어떤 것인지 이해하고 결정하는 LEGB규칙을 갖고 있음.
LEGB Rules
- 변수에 값을 바인딩하거나 변수의 값을 참조하기 위해 사용되는 우선순위
- 동일한 이름의 변수가 함수 내부, 함수(함수()) 있더라도
- 각 변수는 상위 Scope에 영향을 주지 못함.
약자 | full name | means |
---|
L | Local | 함수 안(내부) |
E | Enclosing function locals | 내부 함수에서 자신의 외부 함수의 범위 |
G | Global (Module) | 함수 바깥 == 모듈 범위 |
B | Built-in (Python) | 파이썬 내장 함수들 |
중첩 함수
- 함수 내에 함수가 정의된 것.
- Enclosing function local를 이해하기 위해서 필요.
- 부모 함수의 변수를 자유롭게 읽거나 사용할 수 있음.
def outer():
name = 'bear2kery'
def inner():
print('good night' + name)
inner()
- 함수의 밖에서 중첩 함수 호출 시 NameError 발생

동작 과정으로 알아보는 변수의 위치
name = 'This is Startan'
def func1():
name = 'jaina'
def hello():
name = 'Thrall'
print('Hello '+name)
hello()
- hello() 실행
- hello 함수 내에서
name 변수
가 있는 지 찾음.
▶ 있으면 print()의 name에 반영
- local Lv에 name이 없다면, 바깥 함수 지역에
name 변수
가 있는 지 찾음
▶ 있으면 print()의 name에 반영
- Enclosing~ Lv에 없다면, 전역 변수 name이 있는 지 확인.
▶ 있으면 print()의 name에 반영
5. 전역변수에도 없다면 내장 함수 위치에서 찾음?
사용 시 주의 사항
- 파이썬에 능숙하지 않은 경우 전역변수 키워드 사용하지 않도록 해야함.
- 전역 변수를 매개 변수로 사용하는 방식으로 사용하는 것이 좋음.
- 재할당이 전역 변수 키워드를 대신하게 하지 않도록 주의.
- 재할당을 하다보면 코드의 규모가 커지고 복잡해졌을 때,
함수 내에서 전역변수 키워드를 중복해서 사용할 수 있음