파이썬 변수 범위 문제
조회수 3791회
수년간 프로그래밍을 해왔고, 최근에 파이썬을 배우기 시작했습니다. 아래의 코드는 제가 예상했던대로 파이썬 2.5와 3.0에서 정상적으로 작동하는데요 :
a, b, c = (1, 2, 3)
print(a, b, c)
def test():
print(a)
print(b)
print(c) # (A)
#c+=1 # (B)
test()
현재 주석처리된 line (B)의 주석을 해제하면, line (A)에서 UnboundLocalError: 'c' not assigned 라는 에러가 발생합니다. 변수 a와 b는 정상적으로 출력되는데 말이죠. 이로 인해 두가지 의문점이 생겼습니다 :
- 왜 line (A)보다 뒤에 나오는 line (B)로 인해 line (A)에 에러가 발생하는가
- 왜 변수 a와 b는 정상적으로 출력이 되는데 변수 c는 에러를 일으키는가
제가 생각해 낼 수 있는 유일한 이유는 지역변수 c가 c+=1
에 의해 생성되면서, 지역변수가 생성되기도 전에 "전역"변수 c보다 지역변수가 우선되었기 때문이라는 겁니다. 물론, 지역변수가 존재하기도 전에 변수 범위를 소위 뺏어간다는 부분은 앞뒤가 맞지 않는 것 같습니다.
이 문제에 대한 설명을 부탁드립니다.
1 답변
-
파이썬은 변수의 값이 함수 안에서 할당되었는가 아닌가를 기준으로 함수 내의 변수를 다르게 취급합니다. 만약 함수 내에서 변수에 값을 할당했다면, 이는 기본적으로 지역변수로 취급이 되죠 따라서, line (B)의 주석을 해제하게 되면, 지역변수 c에 값이 할당되기도 전에 값을 참조하려는 꼴이 되는 겁니다.
만약 전역변수로써 해당 변수를 사용하고 싶다면
global c
를 함수의 첫줄에 적으시면 됩니다.
또한 파이썬 3에서는,
nonlocal c
를 이용하면 (굳이 전역변수가 아니더라도) 가장 가까운 바깥 영역의 변수를 사용할 수 있습니다.
댓글 입력