[코드잇] 파이썬에서 하기 쉬운 실수 #2 네임 스페이스

코드잇

안녕하세요, 온라인 코딩 스쿨 코드잇입니다.

지난 네임스페이스 1편에서 파이썬의 네임 스페이스, 그리고 global 키워드를 배웠죠?

2편에서는 파이썬에서 자주 하는 실수와 nonlocal 키워드의 의미를 알려드릴게요.

이번엔 비슷하지만 좀 다른 내용을 다뤄볼게요. 저번 시간에 네임스페이스(namespace)에는 모듈의 전역(Global) 네임 스페이스, 함수나 메소드의 지역(Local) 네임 스페이스가 있다고 배웠습니다.

그런데 파이썬은 함수 안에 또 함수를 정의할 수 있습니다. 다음 코드에선 어떤 숫자가 출력될까요?

#first_example.py

def outer_func():
 x = 1 #---(a)
 def inner_func():
  x = 2 #---(b)
 inner_func()
 print(x) #———(c)

outer_func()

먼저 이런 경우에는 네임 스페이스가 어떻게 될까요? 이 코드에는 first_example.py 모듈의 전역 네임 스페이스, outer_func 함수의 지역 네임 스페이스, inner_func 함수의 지역 네임 스페이스 이렇게 3개가 있습니다.(빌트인 네임 스페이스라고 하나 더 있지만 이건 3편에서 설명해드릴게요)

그리고 변수를 찾는 순서는 inner_func 함수의 지역 네임 스페이스 -> outer_func 함수의 지역 네임 스페이스 -> 전역 네임 스페이스가 됩니다.

여기까지는 이해가 되시죠?

outer_func 함수의 내용을 살펴보면, 변수 x에 일을 넣고, 그 안에 inner_func라는 함수를 정의하고, inner_func 함수를 실행하네요. 그리고 x를 print합니다. 과연 1이 출력될까요? 2가 출력될까요?

답은 1입니다. 이것도 1편에서 봤던 것과 같은 원리입니다. (b)처럼 쓰는 건 (a)에 있는 x에 값을 설정하는 게 아닙니다. 단지 inner_func의 지역 네임 스페이스에 x라는 새 변수를 등록하는 겁니다. 하지만 (c)의 print 함수는 (a)의 x와 같은 위치에 있기 때문에 outer_func의 지역 네임 스페이스에 있던 기존의 x값을 출력할 뿐입니다. 네임 스페이스1편과 정확히 같은 원리입니다.

그런데 만약 그렇다 하더라도 (c)가 가리키는 x의 값을 바꾸고 싶다면 어떻게 해야할까요? 이렇게 고치면 됩니다.

#second_example.py

def outer_func():
 x = 1
 def inner_func():
  nonlocal x #———(d)
  x = 2
 inner_func()
 print(x)

outer_func()

(d)처럼 nonlocal이라는 키워드를 사용하면 됩니다. 마치 이전 내용에서 global 키워드를 사용한 거랑 비슷하죠? 지금 (d)가 가리키는 x처럼 전역 네임 스페이스에 있는 변수는 아니지만 더 넓은 범위의 지역 네임 스페이스에 있는 변수를 가져오려면 nonlocal 키워드로 그 변수를 선언해주면 됩니다.

전역 네임 스페이스의 변수는 global, 현재 위치보다 더 상위의 지역 네임 스페이스에 있는 변수는 nonlocal, 잘 기억하세요!

자, 이렇게 파이썬의 네임 스페이스에 대해 배워보았는데요. 사실 가장 좋은 건 애초에 헷갈리지 않도록 같은 변수 이름을 쓰지 않고, 변수 이름을 매번 새롭게 해주는 겁니다. 그럼 혼동할 일도 없겠죠. 하지만 그것과는 별도로 네임 스페이스의 개념을 이해하는 건 아주 중요합니다.

파이썬 프로그래밍 기초에 대해 자세히 배우고 싶으면, 코드잇에서 72시간 무료로 체험해보세요!

기업문화 엿볼 때, 더팀스

로그인

/