파이썬 변수 범위 문제


수년간 프로그래밍을 해왔고, 최근에 파이썬을 배우기 시작했습니다. 아래의 코드는 제가 예상했던대로 파이썬 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 라는 에러가 발생합니다. 변수 ab는 정상적으로 출력되는데 말이죠. 이로 인해 두가지 의문점이 생겼습니다 :

  1. 왜 line (A)보다 뒤에 나오는 line (B)로 인해 line (A)에 에러가 발생하는가
  2. 왜 변수 ab는 정상적으로 출력이 되는데 변수 c는 에러를 일으키는가

제가 생각해 낼 수 있는 유일한 이유는 지역변수 c가 c+=1에 의해 생성되면서, 지역변수가 생성되기도 전에 "전역"변수 c보다 지역변수가 우선되었기 때문이라는 겁니다. 물론, 지역변수가 존재하기도 전에 변수 범위를 소위 뺏어간다는 부분은 앞뒤가 맞지 않는 것 같습니다.

이 문제에 대한 설명을 부탁드립니다.

  • 2016년 08월 01일에 작성됨

조회수 185


1 답변


좋아요
0
싫어요
채택취소하기

파이썬은 변수의 값이 함수 안에서 할당되었는가 아닌가를 기준으로 함수 내의 변수를 다르게 취급합니다. 만약 함수 내에서 변수에 값을 할당했다면, 이는 기본적으로 지역변수로 취급이 되죠 따라서, line (B)의 주석을 해제하게 되면, 지역변수 c에 값이 할당되기도 전에 값을 참조하려는 꼴이 되는 겁니다.

만약 전역변수로써 해당 변수를 사용하고 싶다면

global c

를 함수의 첫줄에 적으시면 됩니다.

또한 파이썬 3에서는,

nonlocal c

를 이용하면 (굳이 전역변수가 아니더라도) 가장 가까운 바깥 영역의 변수를 사용할 수 있습니다.

  • 2016년 08월 02일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close