본문 바로가기

Python

4-5. 지역변수 vs 전역변수

파이썬 지역변수 vs 전역변수 타이틀 이미지


 

안녕하세요! 지난 시간에는 짧고 간결한 익명 함수인 람다(lambda) 함수를 배우고, 이를 map(), filter(), sorted()와 같은 함수들과 함께 활용하는 방법을 알아보았습니다. 이제 여러분은 함수를 더 유연하게 사용할 수 있게 되었을 거예요!

이번 시간에는 파이썬에서 변수가 영향을 미치는 범위, 즉 **변수의 유효 범위(Scope)**에 대해 알아보겠습니다. 특히 **지역변수(Local Variable)**와 **전역변수(Global Variable)**의 개념과 이 둘이 어떻게 다르게 작동하는지, 그리고 어떤 주의할 점이 있는지 자세히 살펴보겠습니다.

이 개념을 정확히 이해하는 것은 함수를 올바르게 사용하고, 예상치 못한 오류를 피하는 데 매우 중요합니다.


Part 1: 지역변수 (Local Variable) - 함수 안에서만 유효한 변수

지역변수함수 내부에서 정의된 변수를 의미합니다. 지역변수는 오직 그 변수가 정의된 함수 안에서만 사용될 수 있으며, 함수가 호출될 때 생성되고 함수 실행이 끝나면 사라집니다.

1. 지역변수의 특징

  • 유효 범위: 변수가 선언된 함수 내부로 한정됩니다.
  • 생명 주기: 함수가 호출될 때 생성되고, 함수가 종료되면 소멸됩니다.
  • 독립성: 같은 이름의 지역변수가 여러 함수에 존재하더라도, 서로 다른 별개의 변수입니다.

예시: 지역변수의 유효 범위

Python
 
# 파일 이름: local_variable.py

def my_function():
    local_var = "저는 지역변수입니다." # 함수 내에서 정의된 지역변수
    print(local_var)

my_function() # 함수 호출

# 함수 밖에서 지역변수에 접근 시도 (오류 발생!)
# print(local_var) # NameError: name 'local_var' is not defined

def another_function():
    local_var = 123 # 다른 함수에 정의된 같은 이름의 지역변수
    print(local_var)

another_function()

 

[VS Code 터미널 출력]

파이썬 지역변수의 유효 범위 예시

Part 2: 전역변수 (Global Variable) - 프로그램 전체에서 유효한 변수

전역변수함수 외부, 즉 프로그램의 최상단에서 정의된 변수를 의미합니다. 전역변수는 프로그램의 어떤 곳에서든 접근하고 사용할 수 있습니다.

1. 전역변수의 특징

  • 유효 범위: 프로그램 전체에서 유효합니다.
  • 생명 주기: 프로그램이 시작될 때 생성되고, 프로그램이 종료될 때 소멸됩니다.
  • 접근성: 모든 함수에서 읽고 사용할 수 있습니다.

예시: 전역변수의 유효 범위

Python
 
# 파일 이름: global_variable.py

global_var = "저는 전역변수입니다." # 함수 외부, 최상단에서 정의된 전역변수

def print_global_var():
    print(f"함수 내부에서 전역변수 접근: {global_var}") # 함수 내부에서 전역변수 읽기

print(f"함수 외부에서 전역변수 접근: {global_var}") # 함수 외부에서 전역변수 읽기
print_global_var() # 함수 호출

 

[VS Code 터미널 출력]

파이썬 전역변수의 유효 범위 예시

Part 3: 함수 내부에서 전역변수 변경하기 - global 키워드 (주의!)

함수 내부에서 전역변수를 읽는 것은 자유롭습니다. 하지만 함수 내부에서 전역변수의 값을 변경하고 싶다면 이야기가 달라집니다. 파이썬은 기본적으로 함수 내부에서 변수에 값을 할당하면, 같은 이름의 전역변수가 있더라도 새로운 지역변수를 생성합니다.

이러한 기본 동작을 무시하고, 함수 내부에서 전역변수의 값을 실제로 변경하고 싶을 때 global 키워드를 사용합니다.

1. global 키워드 없이 전역변수 변경 시도 (문제 발생)

Python
 
# 파일 이름: global_no_global_keyword.py

counter = 0 # 전역변수

def increment_counter():
    counter = 1 # 이 counter는 전역변수 counter와 다른, 새로운 지역변수입니다!
    print(f"함수 내부 (지역 counter): {counter}")

print(f"함수 호출 전 (전역 counter): {counter}")
increment_counter()
print(f"함수 호출 후 (전역 counter): {counter}") # 전역 counter는 변하지 않음

 

[VS Code 터미널 출력]

global 키워드 없이 전역변수 변경 시도 예시

2. global 키워드를 사용하여 전역변수 변경하기

  • 함수 내부에서 전역변수의 값을 변경하고 싶을 때는 해당 변수명 앞에 global 키워드를 붙여야 합니다.

기본 형식:

Python
 
전역변수 = 초기값

def my_function():
    global 전역변수 # 이 변수가 전역변수임을 명시
    전역변수 = 새로운값 # 전역변수의 값이 변경됨

예시: global 키워드로 전역변수 변경

Python
 
# 파일 이름: global_with_keyword.py

counter = 0 # 전역변수

def increment_counter_global():
    global counter # 이 counter가 전역변수임을 명시
    counter += 1 # 전역변수 counter의 값을 1 증가시킴
    print(f"함수 내부 (전역 counter 변경됨): {counter}")

print(f"함수 호출 전 (전역 counter): {counter}")
increment_counter_global() # 함수 호출
print(f"함수 호출 후 (전역 counter): {counter}") # 전역 counter가 변경됨

increment_counter_global() # 다시 호출
print(f"두 번째 호출 후 (전역 counter): {counter}") # 또 변경됨

 

[VS Code 터미널 출력]

global 키워드를 사용한 전역변수 변경 예시

Part 4: 지역변수 vs 전역변수 사용 시 주의할 점

  • 전역변수 남용 피하기: 전역변수를 너무 많이 사용하면 코드의 흐름을 추적하기 어려워지고, 예상치 못한 버그가 발생하기 쉽습니다. 어떤 함수가 전역변수를 변경하는지 알기 어려워지기 때문입니다.
  • 함수는 독립적으로: 가능하면 함수는 매개변수를 통해 필요한 데이터를 받고, 리턴값을 통해 결과를 돌려주는 독립적인 형태로 작성하는 것이 좋습니다.
  • global 키워드 사용 지양: 꼭 필요한 경우가 아니라면 global 키워드를 사용하여 전역변수를 변경하는 것을 피하는 것이 좋습니다. 대신, 함수에서 변경된 값을 리턴하여 외부에서 그 값을 업데이트하는 방식을 고려해보세요.

모범 사례 (전역변수 대신 리턴값 활용):

Python
 
# 파일 이름: preferred_global_handling.py

current_balance = 10000 # 전역 변수 (이 경우, 데이터 관리용으로 사용될 수 있음)

def deposit_money(amount, balance): # 현재 잔액을 매개변수로 받음
    new_balance = balance + amount
    return new_balance # 변경된 잔액을 반환

def withdraw_money(amount, balance): # 현재 잔액을 매개변수로 받음
    if balance >= amount:
        new_balance = balance - amount
        return new_balance
    else:
        print("잔액이 부족합니다.")
        return balance # 잔액이 부족하면 변경 없이 현재 잔액 반환

print(f"초기 잔액: {current_balance}원")

# 함수 호출 후 반환값으로 전역변수 업데이트
current_balance = deposit_money(5000, current_balance)
print(f"5000원 입금 후 잔액: {current_balance}원")

current_balance = withdraw_money(3000, current_balance)
print(f"3000원 출금 후 잔액: {current_balance}원")

current_balance = withdraw_money(15000, current_balance) # 잔액 부족
print(f"15000원 출금 시도 후 잔액: {current_balance}원")

 

[VS Code 터미널 출력]

전역변수 대신 리턴값으로 데이터를 다루는 모범 사례

마무리하며

이번 시간에는 파이썬 변수의 유효 범위인 **지역변수(Local Variable)**와 **전역변수(Global Variable)**의 개념에 대해 알아보았습니다.

  • 지역변수: 함수 내부에서만 유효하고 함수 종료 시 사라집니다. 함수는 기본적으로 지역변수를 선호합니다.
  • 전역변수: 프로그램 전체에서 유효하지만, 함수 내부에서 값을 변경하려면 global 키워드가 필요합니다.

global 키워드를 사용하여 전역변수를 변경하는 것은 강력한 기능이지만, 코드의 복잡성을 높이고 예상치 못한 문제를 야기할 수 있으므로 가능한 한 지양하고, 대신 매개변수와 리턴값을 통해 데이터를 주고받는 방식을 선호하는 것이 좋습니다.

다음 포스팅에서는 스스로를 호출하는 함수인 **재귀 함수(Recursive Function)**에 대해 알아보겠습니다.


궁금한 점이 있다면 언제든지 질문해주세요! 다음 포스팅에서 만나요!

반응형

'Python' 카테고리의 다른 글

5-2. 파일 쓰기(write, with 구문)  (0) 2025.06.27
4-6. 재귀 함수 이해하기  (0) 2025.06.27
4-4. 람다(lambda) 함수  (0) 2025.06.26
4-1. 함수의 정의와 호출  (0) 2025.06.25
3-6. 리스트/딕셔너리 내포 표현식  (0) 2025.06.25