Python 변수 스코프: 초보자를 위한 종합 가이드

안녕하세요, Python을 꿈꾸는 여러분! ? Python 변수 스코프의 흥미로운 세계에 뛰어들 준비가 되셨나요? 걱정 마세요, 이 튜토리얼을 끝내면 스코프 마스터가 될 거예요! 함께 이 흥미로운 여정을 시작해볼까요?

Python - Variables Scope

Python에서 변수의 스코프 유형

자세히 들어가기 전에 Python에서 "스코프"이란 무엇인지 이해해보겠습니다. 큰 집이 있고 각 방마다 다른 규칙과 물건들이 있는 것을 상상해보세요. Python에서는 이 방들이 다른 스코프들이 되고, 물건들이 우리의 변수들이 됩니다.

Python은 세 가지 주요 변수 스코프가 있습니다:

  1. 로컬 스코프
  2. 글로벌 스코프
  3. 비로컬 스코프

이 각각을 자세히 탐구해보겠습니다.

로컬 변수

로컬 변수는 ваш 방에 있는 개인 물건들과 같습니다. 특정 함수나 코드 블록 내에서만 접근할 수 있습니다.

def greet_user():
name = "Alice"  # 이것은 로컬 변수입니다
print(f"Hello, {name}!")

greet_user()  # 출력: Hello, Alice!
print(name)  # 이는 NameError를 일으킬 것입니다

이 예제에서, namegreet_user() 함수 내의 로컬 변수입니다. 이는 Alice의 이름표가 함수의 방에만 존재하는 것과 같습니다. 함수 밖에서 접근하려고 하면 Python은 "죄송하지만, 여기서는 'name'을 몰라요!"라고 말합니다.

글로벌 변수

글로벌 변수는 냉장고에 걸어둔 집 규칙과 같습니다 - 프로그램 어디서나 접근할 수 있습니다.

house_name = "Python Palace"  # 이것은 글로벌 변수입니다

def welcome_message():
print(f"Welcome to {house_name}!")

welcome_message()  # 출력: Welcome to Python Palace!
print(house_name)  # 출력: Python Palace

여기서, house_name은 우리의 글로벌 변수입니다. 이는 우리 집의 이름이며, 주방, 거실이나 프로그램의 어떤 함수에서든 누구나 볼 수 있고 사용할 수 있습니다.

하지만 함수 내에서 글로벌 변수를 수정하고 싶은 경우는 어떻게 해야 할까요? 그럴 때 global 키워드가 유용합니다:

counter = 0  # 글로벌 변수

def increment_counter():
global counter
counter += 1
print(f"Counter is now: {counter}")

increment_counter()  # 출력: Counter is now: 1
increment_counter()  # 출력: Counter is now: 2

global counter를 사용하면 Python에 "안녕, 집의 카운터를 사용하고 싶어요, 이 방에 새로운 하나를 만들지 않아요!"라고 말하는 것과 같습니다.

비로컬 변수

이제 마스터 층의 게스트 방 안에 있는 것을 상상해보세요. 게스트 방(로컬 스코프)에서는 게스트 방의 물건들을 접근할 수 있고, 마스터 층(비로컬 스코프)에서는 일부 물건들을 접근할 수 있지만, 전체 집(글로벌 스코프)의 모든 것을 접근할 수는 없습니다.

def outer_function():
x = "outer"

def inner_function():
nonlocal x
x = "inner"
print("Inner:", x)

inner_function()
print("Outer:", x)

outer_function()
# 출력:
# Inner: inner
# Outer: inner

이 중첩된 함수 시나리오에서, nonlocal x는 내부 함수가 바깥(둘러싼) 함수의 변수를 수정할 수 있게 합니다.

Python 변수의 네임스페이스와 스코프

네임스페이스를 큰 사전이라고 생각해보세요. Python은 모든 변수를 여기에 보관합니다. 각 스코프는 자신의 네임스페이스를 가집니다.

x = 10  # 글로벌 네임스페이스

def outer():
y = 20  # outer() 네임스페이스

def inner():
z = 30  # inner() 네임스페이스
print(x, y, z)

inner()

outer()  # 출력: 10 20 30

이 예제는 Python이 다른 네임스페이스에서 변수를 탐색하는 방식을 보여줍니다. 가장 내부의 스코프에서부터 외부로 이동하여 탐색합니다.

Python globals() 함수

globals() 함수는 프로그램의 모든 글로벌 변수를 보여주는 마법의 거울과 같습니다.

x = 10
y = "hello"

print(globals())
# 출력: {..., 'x': 10, 'y': 'hello', ...}

이 함수는 모든 글로벌 변수를 포함한 사전을 반환합니다. 디버깅에 매우 유용합니다!

Python locals() 함수

마찬가지로, locals()는 현재 스코프의 모든 로컬 변수를 보여줍니다.

def show_locals():
a = 5
b = "world"
print(locals())

show_locals()
# 출력: {'a': 5, 'b': 'world'}

이 함수는 현재 "방"에서 어떤 변수들이 사용할 수 있는지 살펴보는 데 큰 도움이 됩니다.

Python의 네임스페이스 충돌

때로는 다른 스코프의 변수들이 같은 이름을 가질 수 있어서 네임스페이스 충돌이 발생할 수 있습니다. Python은 이를 해결하기 위해 LEGB 규칙을 사용합니다: 로컬, 둘러싼, 글로벌, 내장.

x = "global"

def outer():
x = "outer"

def inner():
x = "inner"
print("Inner x:", x)

inner()
print("Outer x:", x)

outer()
print("Global x:", x)

# 출력:
# Inner x: inner
# Outer x: outer
# Global x: global

이 예제에서는 각 스코프가 자신의 x를 가지고 있으며, Python은 가장 가까운 곳에서 호출된 것을 사용합니다.

다음은 우리가 논의한 주요 함수들을 요약한 표입니다:

함수 설명 예제
globals() 글로벌 변수들을 포함한 사전을 반환합니다 print(globals())
locals() 로컬 변수들을 포함한 사전을 반환합니다 print(locals())
global 함수 내에서 글로벌 변수를 선언합니다 global x
nonlocal 중첩된 함수 내에서 비로컬 변수를 선언합니다 nonlocal y

기억해주세요, 변수 스코프를 이해하는 것은 새로운 집의 구조를 배우는 것과 같습니다. 처음에는 혼란스러울 수 있지만, 연습을 통해 이 "방들"을 프로처럼 탐험할 수 있을 거예요! 코딩을 계속하고, 탐구하고, 실험해보세요. 결국 Python을 배우는 가장 좋은 방법은 실천입니다. 즐거운 코딩! ?✨

Credits: Image by storyset