파이썬에서 변수가 어디에서 정의되고, 어디에서 접근 가능한지를 이해하는 것은 매우 중요합니다. 이를 이해하기 위해서는 변수의 스코프(Scope)와 네임스페이스(Namespace)에 대한 개념을 알아야 합니다. 이번 글에서는 파이썬에서의 변수 스코프와 네임스페이스의 개념과 이들이 어떻게 동작하는지 설명하겠습니다.

1. 변수 스코프(Scope)란?

스코프(Scope)는 변수가 유효한 범위, 즉 변수가 접근 가능하고 사용할 수 있는 코드 영역을 의미합니다. 파이썬에서는 주로 네 가지 스코프를 구분할 수 있습니다:

  1. 지역 스코프(Local Scope): 함수 내부에서 정의된 변수의 스코프입니다. 함수 내에서만 접근할 수 있습니다.
  2. 비지역 스코프(Enclosing Scope): 중첩된 함수에서 바깥쪽 함수의 스코프입니다. 중첩된 함수 내부에서 접근할 수 있습니다.
  3. 전역 스코프(Global Scope): 모듈의 최상위에서 정의된 변수의 스코프입니다. 모듈 전체에서 접근할 수 있습니다.
  4. 내장 스코프(Built-in Scope): 파이썬이 기본적으로 제공하는 함수나 예외 같은 내장 요소의 스코프입니다.

파이썬에서는 LEGB 규칙(Local, Enclosing, Global, Built-in)을 따릅니다. 이는 파이썬이 변수를 찾을 때 어떤 순서로 스코프를 검색하는지 나타냅니다.

1.1. LEGB 규칙

파이썬에서 변수를 참조할 때, 파이썬은 다음 순서로 스코프를 검색합니다:

  • Local: 현재 함수 내에서 변수를 찾습니다.
  • Enclosing: 중첩 함수가 있는 경우, 바깥 함수의 스코프를 찾습니다.
  • Global: 모듈 전체에서 변수를 찾습니다.
  • Built-in: 파이썬 내장 네임스페이스에서 변수를 찾습니다.

2. 변수 스코프의 예시

2.1. 지역 변수(Local Variable)

지역 변수는 함수 내부에서 정의되며, 해당 함수 내부에서만 유효합니다.

def my_function():
    x = 10  # x는 지역 변수
    print(f"Inside the function, x = {x}")

my_function()
# print(x)  # 오류 발생: x는 함수 외부에서 접근 불가

위 코드에서 x는 my_function 내부에서만 유효하며, 함수 외부에서는 접근할 수 없습니다.

2.2. 전역 변수(Global Variable)

전역 변수는 모듈의 최상위에서 정의되며, 모듈 전체에서 접근할 수 있습니다.

x = 20  # x는 전역 변수

def my_function():
    print(f"Inside the function, x = {x}")

my_function()
print(f"Outside the function, x = {x}")

위 코드에서 x는 전역 변수로, 함수 내부와 외부에서 모두 접근할 수 있습니다.

2.3. 비지역 변수(Enclosing Variable)

비지역 변수는 중첩된 함수에서 바깥쪽 함수의 변수를 참조할 때 사용됩니다.

def outer_function():
    x = 30  # x는 비지역 변수

    def inner_function():
        print(f"Inside the inner function, x = {x}")

    inner_function()

outer_function()

위 코드에서 inner_function은 outer_function 내부의 변수 x를 참조합니다. 이때 x는 비지역 변수입니다.

2.4. global 키워드

함수 내부에서 전역 변수를 수정하려면 global 키워드를 사용해야 합니다.

x = 40  # 전역 변수

def my_function():
    global x
    x = 50  # 전역 변수 수정
    print(f"Inside the function, x = {x}")

my_function()
print(f"Outside the function, x = {x}")

위 코드에서 global x는 함수 내부에서 전역 변수 x를 수정할 수 있도록 합니다.

2.5. nonlocal 키워드

중첩 함수에서 비지역 변수를 수정하려면 nonlocal 키워드를 사용해야 합니다.

def outer_function():
    x = 60  # 비지역 변수

    def inner_function():
        nonlocal x
        x = 70  # 비지역 변수 수정
        print(f"Inside the inner function, x = {x}")

    inner_function()
    print(f"Inside the outer function, x = {x}")

outer_function()

위 코드에서 nonlocal x는 inner_function이 outer_function 내부의 변수 x를 수정할 수 있도록 합니다.

3. 네임스페이스(Namespace)란?

네임스페이스(Namespace)는 변수 이름을 객체에 매핑하는 시스템입니다. 파이썬에서는 다음과 같은 네임스페이스가 존재합니다:

  1. 로컬 네임스페이스(Local Namespace): 함수 내부에서 생성된 변수들이 속한 네임스페이스입니다.
  2. 전역 네임스페이스(Global Namespace): 모듈의 최상위에서 생성된 변수들이 속한 네임스페이스입니다.
  3. 내장 네임스페이스(Built-in Namespace): 파이썬이 기본적으로 제공하는 함수와 예외 등이 속한 네임스페이스입니다.

네임스페이스는 특정 스코프 내에서 변수 이름을 관리합니다. 변수의 유효 범위는 해당 변수의 네임스페이스에 따라 결정됩니다.

3.1. 네임스페이스의 예시

# 전역 네임스페이스
x = "global"

def my_function():
    # 로컬 네임스페이스
    x = "local"
    print(f"Inside the function, x = {x}")

my_function()
print(f"Outside the function, x = {x}")

위 코드에서 함수 내부의 x는 로컬 네임스페이스에 속하며, 함수 외부의 x는 전역 네임스페이스에 속합니다.

4. 네임스페이스와 스코프의 관계

네임스페이스와 스코프는 밀접한 관계가 있습니다. 스코프는 변수가 접근할 수 있는 범위를 정의하고, 네임스페이스는 해당 범위 내에서 변수 이름을 관리합니다. 파이썬은 변수의 이름을 검색할 때 먼저 로컬 네임스페이스에서 찾고, 그다음 비지역, 전역, 내장 네임스페이스를 차례로 검색합니다.

4.1. locals()와 globals() 함수

파이썬은 현재의 로컬 및 전역 네임스페이스를 조회할 수 있는 locals()와 globals() 함수를 제공합니다.

def my_function():
    local_var = "I'm local"
    print("Local namespace:", locals())

global_var = "I'm global"
my_function()
print("Global namespace:", globals())

위 코드에서 locals() 함수는 현재 함수의 로컬 네임스페이스를, globals() 함수는 현재 모듈의 전역 네임스페이스를 반환합니다.

5. 변수 스코프와 네임스페이스의 활용 사례

5.1. 함수 내부에서 전역 변수 접근

전역 변수를 수정하지 않고 함수 내부에서 접근하려면 global 키워드를 사용할 필요가 없습니다.

x = 10

def my_function():
    print(f"Using global variable x = {x}")

my_function()  # 출력: Using global variable x = 10

5.2. 함수 내부에서 전역 변수 수정

전역 변수를 수정하려면 global 키워드를 사용해야 합니다.

x = 10

def my_function():
    global x
    x = 20
    print(f"Modified global variable x = {x}")

my_function()
print(f"Global variable x after modification = {x}")  # 출력: Global variable x after modification = 20

결론

이번 글에서는 파이썬에서 변수의 스코프와 네임스페이스의 개념을 살펴보았습니다. 스코프는 변수가 유효한 범위를 정의하며, 네임스페이스는 변수 이름을 관리합니다. 파이썬은 LEGB 규칙을 사용하여 변수를 검색하며, global과 nonlocal 키워드를 통해 전역 변수와 비지역 변수를 수정할 수 있습니다. 이 개념을 잘 이해하면 변수 관리와 코드의 가독성을 크게 향상시킬 수 있습니다.


이 글을 통해 파이썬의 변수 스코프와 네임스페이스에 대해 이해하고, 이를 효과적으로 사용하는 방법

을 익힐 수 있을 것입니다. 스코프와 네임스페이스를 올바르게 사용하여 더욱 깔끔하고 유지보수하기 쉬운 코드를 작성해 보세요!

+ Recent posts