SMALL
LEGB 의미
L | Local Scope의 약자로 가장 안의 함수 안을 의미합니다. |
E | Enclosed function locals Scope의 약자로 내부함수에서 자신의 외부 함수의 범위를 의미 |
G | Global Scope의 약자로 함수 바깥 즉, 모듈 범위 |
B | Built-in Scope의 약자로 파이썬에서 기본적으로 제공되는 함수, 클래스, 예외 및 기타 객체들이 포함된 이름이다. ex) print(), len(), int(), str() |
※ 함수 내에서 바깥 Scope의 변수에 접근은 가능하지만 수정은 할 수 없음!
1. 다중 중첩 함수 예시 (Enclosed와 Local Scope 사용)
x = 10 # Global 변수
def outer():
x = 20 # Enclosed 변수
def middle():
x = 30 # Local 변수
def inner():
print(x) # 30 출력, 가장 가까운 Local Scope에서 찾음
inner()
middle()
outer()
print(x) # 10 출력, Global Scope에서 찾음
- inner() 함수에서 x는 가장 가까운 Local Scope(middle 함수)에서 찾음.
- middle() 함수에서는 x가 Local Scope로 정의되어 있지만, outer() 함수에 의해 Enclosed Scope로도 참조된다.
- 최종적으로 외부에서 x는 Global Scope에서 찾는다.
2. 함수와 내장 함수의 이름 충돌 예시 (Built-in과 Local Scope)
def max():
return 100 # Local 변수
print(max()) # 100 출력, max()는 Local 함수
x = max # max를 전역 변수로 바꿈
print(x()) # 100 출력, x는 Local에서 정의된 함수
# 내장 함수 max() 사용
max_value = max([1, 2, 3, 4]) # Built-in max() 사용
print(max_value) # 4 출력, 내장 함수 max()를 참조
- max()라는 이름이 Local Scope와 Built-in Scope에 충돌함.
- max()를 호출할 때, 먼저 Local Scope에서 정의된 함수가 호출된다.
- max()를 x에 할당한 후에도, Built-in Scope의 내장 함수 max()를 사용하여 [1, 2, 3, 4]의 최댓값을 구할 수 있다.
3. Global 변수와 함수의 이름 충돌 예시
x = 50 # Global 변수
def x(): # 함수 이름으로 x를 덮어씀
return 100
print(x()) # 100 출력, x는 Local 함수로 참조됨
print(globals()['x']) # 50 출력, Global Scope에서 x를 참조
- x()라는 함수는 Local Scope에서 참조된다.
- globals()를 사용하면 Global Scope에 있는 x를 참조할 수 있음.
4. 내부 함수에서 글로벌 변수 변경 (global 키워드 사용)
x = 5 # Global 변수
def outer():
x = 10 # Enclosed 변수
def inner():
global x # Global 변수 x 사용
x = 20 # Global 변수 x 수정
inner()
print(x) # 20 출력, global 키워드로 Global Scope에서 수정된 값
outer()
print(x) # 20 출력, Global Scope에서 x를 변경한 결과
- inner() 함수에서 global x를 사용하여 Global Scope의 x를 수정함.
- outer() 함수 내에서도 x가 Enclosed Scope에서 참조되지만, global 키워드로 Global Scope를 수정한 결과는 프로그램 전체에 영향을 미친다.
5. 클래스 내에서의 스코프 예시 (Enclosed, Global, Local 혼합)
x = "Global x" # Global 변수
class MyClass:
x = "Class x" # 클래스 변수
def __init__(self):
self.x = "Instance x" # 인스턴스 변수
def method(self):
x = "Local x" # Local 변수
print(x) # Local x 출력, 가장 가까운 Local Scope에서 찾음
print(self.x) # Instance x 출력, 인스턴스 변수에서 찾음
print(MyClass.x) # Class x 출력, 클래스 변수에서 찾음
print(globals()['x']) # Global x 출력, Global Scope에서 찾음
obj = MyClass()
obj.method()
- method() 내에서 x는 Local Scope에서 참조된다.
- self.x는 Instance Scope에서 참조되는 인스턴스 변수.
- MyClass.x는 Class Scope에서 참조되는 클래스 변수.
- globals()['x']는 Global Scope에서 참조되는 전역 변수.
6. 타입 오류 예시: 변수와 함수 이름 충돌로 인한 오류
x = "Hello" # Global 변수
def x(): # 함수 이름으로 x를 덮어씀
return 10 # 함수가 10을 반환
def outer():
x = [1, 2, 3] # Enclosed 변수: 리스트
return x() # 타입 오류 발생: 리스트는 함수처럼 호출할 수 없음
print(outer())
설명 :
- Global Scope에서 x는 문자열 "Hello"
- x()는 Local Scope에서 함수로 정의되어 있으며, 이는 10을 반환한다.
- outer() 함수 내에서 x는 Enclosed Scope에서 리스트 [1, 2, 3]로 정의된다.
- x()를 호출하려고 시도하는데, x는 함수가 아니라 리스트이고, 리스트는 호출할 수 없기 때문에 TypeError가 발생함
결과 : TypeError: 'list' object is not callable
7. 타입 오류 예시: int와 str을 잘못 다룰 때
x = 10 # Global 변수
def outer():
x = "Hello" # Enclosed 변수 (문자열)
def inner():
x = 5 # Local 변수 (정수)
return x + " world" # 타입 오류 발생: 정수와 문자열을 더하려고 시도
return inner()
print(outer())
설명 :
- outer() 함수에서 x는 Enclosed Scope에서 문자열 "Hello"로 정의된다.
- inner() 함수 내에서 x는 Local Scope에서 정수 5로 정의된다.
- inner() 함수는 x + " world"를 실행하려고 하는데, x는 정수형이고 " world"는 문자열이기 때문에 이 둘을 더하려고 시도하면 TypeError가 발생.
결과 : TypeError: unsupported operand type(s) for +: 'int' and 'str'
으아 어렵다
LIST
'Today I learned' 카테고리의 다른 글
2024.12.20 해시테이블 (4) | 2024.12.20 |
---|---|
WIL 퀴즈 3개(LEGB, 재귀함수 약간) (1) | 2024.12.20 |
The Boston Housing Dataset(보스턴 주택 가격 데이터셋) (18) | 2024.12.18 |
2024.12.17 각종 컴프리헨션 예제 (3) | 2024.12.17 |
*args와 **kwargs (2) | 2024.12.17 |