Python Basic : Global 변수, 전역 변수, 지역 변수, 함수 내에서 global 변수 수정하기
a = 5
def change_value():
a = 10
change_value()
print(a)
-- Result
5
위 코드를 봅시다.
- a = 5
처음에 함수 밖에서 변수 a에 5를 할당했습니다.
- def change_value():
그리고 change_value라는 함수를 생성하여 함수 안에서 변수 a에 10을 할당합니다.
- change_value()
생성한 change_value 함수를 실행하죠.
- print(a)
그리고 a를 출력합니다.
맨 처음에 a에 5를 할당하고 함수에서 a에 10을 다시 할당했으니 결과가 10일까요?
아닙니다. 5입니다.
왜 이런 일이 발생했을까요?
Python에서 함수 밖과 함수 안에서 어떤 변수가 취급되는 방식이 다르기 때문입니다.
위 예시에서 가장 먼저 함수 밖에서 변수 a에 5가 할당되었습니다.
그리고 함수 안에서도 변수 a에 10이 할당되었죠.
비록 함수 밖과 안에서 a라는 이름의 변수를 다룬 것은 맞습니다.
하지만 이 두 개의 변수 a는 서로 다릅니다.
함수 안에서의 a는 함수 밖에 있는 a와는 전혀 다른 변수라고 생각하면 됩니다.
비록 이름이 같다고 해도 함수 내부에 존재하는 변수 a는 함수 내에서만 일시적으로 사용되는 임시 변수이기 때문입니다.
Python에서 변수의 종류는 2가지가 있습니다.
전역 변수와 지역 변수입니다.
위 예시에서 함수 밖에서 선언된 변수 a는 전역 변수(Global Variable)입니다.
전역 변수는 함수 밖, 함수 안 등 Python 코드 전체에서 참조가 가능합니다.
다만, 위 예시에서처럼 함수 안에서 전역변수와 동일한 이름의 변수에 값을 변경하려고 해도 바뀌지 않습니다.
a = 5
def change_value(a):
print(a)
a = 10
print(a)
change_value(a)
print(a)
-- Result
5
10
5
예시를 살짝 바꿔보았습니다.
a = 5
가장 위쪽에서 전역 변수 a에 5가 할당되고 있습니다.
def change_value(a):
print(a)
a = 10
print(a)
change_value(a)
change_value 함수에서는 먼저 a라는 값을 parameter로서 전달하고, 전달받은 a를 print하고 있습니다.
그리고 변수 a에 10을 할당하고 다시 a를 print합니다.
이 부분의 결과를 보면 첫 번째 print(a)의 결과는 5 입니다.
왜냐면 parameter로 받은 a는 전역 변수인 a이며 5라는 값을 가지고 있기 때문입니다.
그리고 이 a에 10을 재할당하였고 두 번째 print(a)의 결과는 10입니다.
너무 당연하죠.
print(a)
하지만 함수 밖에서 print(a)를 한 결과는 5가 나옵니다.
이렇게 함수 내부에서는 전역 변수를 참조는 할 수 있지만 함수 내부에서 전역 변수에 할당된 값을 수정할 수 없습니다.
함수 안에서 선언된 변수 a는 지역 변수(Local Variable)입니다.
지역 변수는 함수 안에서 선언되어 함수 내부에서만 참조/변경이 가능하고 함수가 끝나고 난 후에는 메모리에서 사라집니다.
따라서 함수 밖에서 함수 내부의 지역 변수를 참조하는 것은 불가능합니다.
def change_value():
a = 10
print(a)
change_value()
print(a)
-- Result
10
NameError: name 'a' is not defined
위 예시를 봅시다.
change_value 함수를 만들고 함수 내부에서 변수 a에 10을 할당하고 있습니다.
그리고 함수 내부에서 print(a)를 하는데 당연히 10이 출력될겁니다.
마지막 부분을 보면 함수 밖에서도 print(a)를 하는데 여기서는 a가 정의되지 않았다는 에러가 발생합니다.
그 이유는 change_value 함수 내부에서 생성된 a라는 변수는 함수 내부에서만 사용되는 지역 변수이기 때문에 함수가 종료된 순간 메모리에서 사라지므로 함수 밖에서는 참조할 수 없기 때문입니다.
위에서 전역 변수를 설명할 때 함수 내부에선 전역 변수의 참조만 가능할 뿐 전역 변수를 수정할 수 없다라고 했습니다.
하지만 어떤 키워드를 사용하면 함수 내부에서도 전역 변수를 수정할 수 있게 됩니다.
a = 5
def change_value():
global a
a = 10
print(a)
change_value()
print(a)
-- Result
10
10
위 예시는 처음에 봤던 예시와 비슷합니다.
함수 밖에서 변수 a에 5를 할당한 후,
change_value 함수 내부에서 변수 a에 10을 재할당합니다.
근데 change_value 함수 내부에서 global a 라는 부분이 추가되었습니다.
함수 내부에서 어떤 변수이름 왼쪽에 global 키워드를 붙이면 해당 변수는 전역 변수다 라고 명시해주는 의미가 됩니다.
따라서 global a 라는 구문이 명시된 순간 a라는 이름의 변수는 바로 함수 밖에 존재하는 전역 변수를 타겟으로 한다 라는 의미를 주는 것이죠.
이렇게 global a 로 함수 내부에서 변수 a를 전역 변수를 바라보도록 설정해주면 함수 내부에서 전역 변수 a의 참조와 수정이 가능합니다.
그래서 위 예시를 보면 함수 내부에서 변수 a에 10을 할당한 후 함수 외부에서 print(a)를 한 가장 마지막 부분의 결과도 10으로 바뀌는 것을 볼 수 있습니다.