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

코드잇

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

오늘은 파이썬 코드를 작성하다가 실수하기 쉬운 부분을 말씀드리려고 해요! 네임 스페이스에 관련된 내용입니다.

자, 바로 코드를 보여드릴게요. 아래 코드를 실행하면 무슨 숫자가 출력될까요?

#first_example.py

x = 1 #---(c)
def func():
 print(x)

func()

x가 1이니까 당연히 1이 출력되겠죠? 네, 맞습니다. 그렇다면 다음 코드에선 무슨 숫자가 출력될까요?

#second_example.py

x = 1 #---(a)

def func():
 x = 2 #---(b)

func()
print(x)

일단 x에 1을 넣고 func1 함수에서는 x에 2를 대입하네요. 그럼 x의 값인 2가 출력될까요?

그렇지 않습니다. 1이 출력됩니다. 그건 바로 (b)가 가리키는 x가 아니라, (a)가 가리키는 x의 값이 출력되었기 때문인데요. 그러니까 (a)가 가리키는 x와 (b)가 가리키는 x는 다른 x라는 뜻입니다. 헷갈리시나요?

바로 이 부분이 파이썬 초보에서 중수로 넘어갈 수 있는 기회이니 끝까지 읽어보세요:)

파이썬의 변수에는 네임 스페이스라는 개념이 있습니다. 이건 특정 위치에서 접근할 수 있는 변수들이 존재하는 공간인데요. 파이썬에서는 모듈(“~.py”라고 끝나는 파일이라고 생각하시면 됩니다)

하나에 해당하는 전역 네임 스페이스(Global namespace)와 각 함수 또는 메소드에 존재하는 지역 네임 스페이스(Local namespace)가 있습니다(그 밖에 빌트인 네임 스페이스라는 것도 있습니다). 위 코드에서 (a)가 가리키는 x는 전역 네임 스페이스에 있는 변수이고, (b)가 가리키는 x는 func 함수의 지역 네임 스페이스에 있는 변수입니다. (a)가 가리키는 x는 first_example.py 파일에 바로 속해있고, (b)가 가리키는 x는 func 함수 안에 있기 때문에 그런 겁니다. 그러니까 이름은 같지만 전혀 다른 변수라는 뜻입니다.

우리가 어떤 변수의 값을 그 이름으로 부르면, 부르는 그 위치에 해당하는 네임 스페이스에서 그 변수를 찾습니다. 그런데 그런 이름의 변수가 없으면 더 큰 범위의 네임 스페이스로 이동해서 그 변수를 찾습니다. 그러니까 first_example.py에서는 func 함수에 x라는 변수가 선언된 적이 없기 때문에 func 함수의 지역 네임 스페이스를 벗어나, 전역 네임 스페이스에 있는 x, 그러니까 (c)가 가리키는 x의 값을 잘 출력한 겁니다.

그럼 second_example.py를 자세히 살펴볼까요? (b)가 실행될 때 우리는 보통 (a)가 가리키는 x, 그러니까 전역 네임 스페이스에 있는 변수를 수정한다고 생각하기 쉽습니다. 하지만 전혀 아닙니다!

(b)는 그냥 func 함수의 지역 네임 스페이스에, x라는 새 변수를 추가한다는 뜻입니다. 우리의 예상과 전혀 다르죠?

first_example.py처럼 변수의 값을 읽을 때와는 다르게 값을 설정할 때는 우리의 생각과는 전혀 다르게 동작하는 겁니다. 그래서 second_example.py가 실행될 때, 2가 아닌 1이 출력된 겁니다. 꼭 기억하세요!

그래도 여전히 우리는 전역 네임 스페이스에 있는 x를 func 함수에서 수정하고 싶네요. 방법이 없는 건 아닙니다. 아래 코드의 (d)가 가리키는 코드 한줄을 추가하면 됩니다.

#third_example.py

x = 1

def func():
 global x #---(d)
 x = 2

func()
print(x)

(d)처럼 쓰게되면 이제 전역 네임 스페이스에 있는 변수 x를 사용하겠다고 선언하는 겁니다. 실행해보면 이제는 2가 잘 출력됩니다. 함수 내에서 전역 네임 스페이스에 있는 변수에 접근하려면 이렇게 global이라는 키워드를 쓰면 되는 겁니다.

하지만 프로그램에서 사실 global 키워드를 자주 쓰는 건 바람직하지 않습니다. 프로그램의 여러 함수에 (d)처럼 x를 건드리는 부분이 있다면 x가 어떤 이유로, 어떤 순서로 변하는지 파악하기가 힘듭니다. 그럼 이건 곧 프로그램의 내용을 파악하기가 힘들어진다는 뜻입니다. 하지만 어쩔 수 없이 써야하는 경우가 생길 수도 있으니 global 키워드를 기억하세요.

파이썬의 네임 스페이스를 확실히 이해하셨나요? 실수하기 쉬운 내용이니까 꼭 이해하셔야 합니다. 이번 컨텐츠에 이어서 다음에는 네임 스페이스에 관한 2번째 컨텐츠를 준비할게요 :)

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

#파이썬 #프로그래밍기초 #네임스페이스 #namespace #코드잇 #코딩 #python #codeit

기업문화 엿볼 때, 더팀스

로그인

/