2024.12.19 LEGB 규칙

SMALL

LEGB 의미

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())

설명 :

  1. Global Scope에서 x는 문자열 "Hello"
  2. x()는 Local Scope에서 함수로 정의되어 있으며, 이는 10을 반환한다.
  3. outer() 함수 내에서 x는 Enclosed Scope에서 리스트 [1, 2, 3]로 정의된다.
  4. 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())

설명 :

  1. outer() 함수에서 x는 Enclosed Scope에서 문자열 "Hello"로 정의된다.
  2. inner() 함수 내에서 x는 Local Scope에서 정수 5로 정의된다.
  3. inner() 함수는 x + " world"를 실행하려고 하는데, x는 정수형이고 " world"는 문자열이기 때문에 이 둘을 더하려고 시도하면 TypeError가 발생.

결과 : TypeError: unsupported operand type(s) for +: 'int' and 'str'

 

 


 

 

 

으아 어렵다

 

LIST