Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python global 키워드 완벽 가이드 – 전역 변수 선언과 활용 방법

Python으로 프로그래밍하다 보면 변수를 선언한 후, 그 변수를 현재 스코프(유효 범위)가 아닌 프로그램의 다른 영역에서 수정하거나 참조해야 하는 경우가 자주 발생합니다. 이럴 때 사용하는 것이 바로 global 키워드입니다. 함수 내부에서 변수 앞에 global을 붙여 선언하면 해당 변수를 전역 범위(global scope)에서 다룰 수 있습니다. 반대로 변수가 함수 밖에 선언되어 있다면, 별도의 선언 없이도 자동으로 전역 변수로 취급됩니다.

함수 외부에 선언된 변수

아래 예제는 값이 함수 바깥에 선언되어 있지만, 함수 내부에서 문제없이 접근할 수 있는 경우를 보여줍니다. 함수 밖에서 선언된 변수는 이미 전역 범위를 가지기 때문입니다.

예제

x = 56

def func():
    y = x * 2
    return y

print(func())

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

출력 결과

112

함수 내부에서 변수를 수정할 때 발생하는 오류

그렇다면 함수 내부에서 전역 변수의 값을 직접 변경하려면 어떻게 될까요? 다음 예제처럼 함수 안에서 변수 값을 수정하려고 하면 오류가 발생합니다.

예제

x = 56

def func():
    y = x * 2
    x = x + 2
    return y

print(func())

위 코드를 실행하면 다음과 같은 오류 메시지가 나타납니다.

출력 결과

UnboundLocalError: local variable 'x' referenced before assignment

이 오류가 발생하는 이유는 함수 내부 어디선가 x에 값을 할당하는 순간, Python은 x를 지역 변수(local variable)로 간주하기 때문입니다. 따라서 값이 할당되기 전에 x를 참조하려고 하면 위와 같은 UnboundLocalError가 발생합니다.

global 키워드로 전역 변수 수정하기

전역 범위를 가진 변수를 함수 내부에서 수정할 수 있는 유일한 방법은, 함수 안에서 해당 변수를 global로 명시적으로 선언하는 것입니다.

예제

x = 56

def func():
    global x
    x = x + 2
    y = x * 2
    return y

print(func())

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

출력 결과

116

global x 선언 덕분에 함수 내부의 x는 더 이상 지역 변수가 아니라 전역 변수를 가리키게 되어, 값 수정이 정상적으로 이루어집니다.

중첩 함수(Nested Function)에서의 global 키워드

중첩 함수(함수 안에 정의된 함수)의 경우에는 가장 안쪽 함수에서 global 변수를 선언합니다. 아래 예제를 통해 동작 방식을 확인해 보겠습니다.

예제

def func_out():
    x = 56

    def func_in():
        global x
        x = 20
        print("x is: ", x)
        x = x + 3
        y = x * 2
        print("y is: ", y)

    func_in()

func_out()
print("x is: ", x)

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

출력 결과

x is: 20
y is: 46
x is: 23

여기서 주목할 점은 func_out() 내부에 지역 변수 x = 56이 존재하지만, 안쪽 함수 func_in()에서 global x를 선언했기 때문에 새로운 전역 변수 x가 생성된다는 것입니다. 이 전역 x는 20으로 초기화된 뒤 3이 더해져 최종적으로 23이 되며, 마지막 print문에서 전역 변수 값인 23이 출력됩니다. 한편 func_out()의 지역 변수 x = 56은 전혀 영향을 받지 않습니다.

정리

  • 함수 밖에서 선언된 변수는 자동으로 전역 변수이며, 함수 내부에서 읽기만 하는 것은 가능합니다.
  • 함수 내부에서 값을 할당하려고 하면 해당 변수는 지역 변수로 취급되어 UnboundLocalError가 발생할 수 있습니다.
  • 함수 내부에서 전역 변수를 수정하려면 반드시 global 키워드로 선언해야 합니다.
  • 중첩 함수에서는 가장 안쪽 함수에서 global을 선언하여 전역 변수를 생성하거나 수정할 수 있습니다.