Post

전역 변수(global)

global

global 키워드는 파이썬에서 변수의 범위(Scope)를 다룰 때 사용된다. 변수의 범위란 변수가 프로그램의 어느 부분에서 정의되고 접근될 수 있는지를 결정하는 규칙이다. 파이썬에서는 기본적으로 변수의 범위가 그 변수가 정의된 함수나 코드 블록에 한정된다. 하지만 때로는 함수 내부에서 전역 변수(global variable)에 접근하거나 이를 수정해야 할 필요가 있다. 이때 global 키워드를 사용한다. 😉

사용 방법

전역 변수를 사용하려면, 변수 이름 앞에 global 키워드를 붙여 해당 변수가 전역 범위에 있다는 것을 명시하면 된다.

1
2
3
4
5
6
7
8
# 함수 내부에서 전역 변수를 수정하려고 하지만, global 키워드를 사용하지 않음
x = 10  # 전역 변수

def update_x():
    x = x + 5  # 여기서 에러 발생
    print(x)

# "UnboundLocalError: local variable 'x' referenced before assignment"
1
2
3
4
5
6
7
8
x = 10  # 전역 변수

def update_x_correctly():
    global x  # 전역 변수 x를 수정하겠다고 명시
    x = x + 5  # 전역 변수 수정
    print(x)

update_x_correctly()  # 정상 작동, 전역 변수 x를 업데이트하고 출력

여기서 문제! 아래 코드는 x가 정상 출력될까?

1
2
3
4
5
6
7
x = 10

def print_x():
    x = 5
    print(x)

print_x()

이 코드에서 print_x 함수 내부에서 x = 5라고 할당하면, 파이썬은 x를 함수 내의 로컬 변수로 취급한다. 이때 함수 내부에서 x를 출력하면, 함수 내부에 정의된 로컬 변수 x의 값인 5를 출력한다.

근데 왜 아래 코드는 오류가 발생할까? 🧐

1
2
3
4
5
6
7
x = 10

def print_x():
    x = x + 5
    print(x)

print_x()

이 코드에서 print_x 함수에서 x = x + 5를 실행하려고 하면, 파이썬은 x를 먼저 참조해야 한다(x + 5에서의 x). 그러나 이 로컬 변수 x는 할당 문(x = x + 5)이 실행되기 전에는 정의되지 않았다. 즉, x + 5 연산을 수행하려 할 때 로컬 변수 x가 아직 초기화되지 않았기 때문에, 파이썬은 “로컬 변수 ‘x’가 할당되기 전에 참조되었다”는 UnboundLocalError를 발생시킨다. 🫢

장단점

  • 장점
    • 전역 접근성: 프로그램의 어느 곳에서나 접근할 수 있어, 여러 함수나 모듈들 사이에서 데이터를 공유하기 쉽다.
    • 데이터 공유 용이성: 관련된 여러 함수나 클래스가 같은 데이터에 접근해야 할 때, 전역 변수를 사용하면 복잡한 인터페이스 없이 데이터를 공유할 수 있다.
    • 메모리 할당: 전역 변수는 프로그램이 실행되는 동안 지속되므로, 반복적인 함수 호출에서도 동일한 데이터를 유지할 수 있으며, 필요할 때마다 재할당하지 않아도 된다.
  • 단점
    • 유지보수의 어려움: 코드의 어느 곳에서나 변경될 수 있어, 변수가 어떻게 변경되고 사용되는지 추적하기 어렵게 만든다. 이로 인해 코드의 가독성과 유지 보수성이 저하될 수 있다.
    • 네임스페이스 오염: 많은 전역 변수를 사용하면 네임스페이스가 오염될 수 있으며, 변수 이름 충돌을 일으킬 수 있다.
    • 코드의 재사용성 감소: 전역 변수에 의존하는 코드는 그 변수 없이는 재사용하기 어렵다. 따라서 코드의 모듈화와 재사용성이 저하될 수 있다.
This post is licensed under CC BY 4.0 by the author.