[코드잇] 파이썬에서 하기 쉬운 실수 #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

기업문화 엿볼 때, 더팀스

로그인

/