안녕하세요, 온라인 코딩 스쿨 코드잇입니다.
지난 네임스페이스 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시간 무료로 체험해보세요!