본문 바로가기
Python notes/Others

파이썬) __name__ 변수는 뭐지? (+if __name__=="__main__"의 의미..)

by 성실한 나무 2021. 3. 28.

#1. 변수를 정의할 때 꼭 필요한 문장?

함수를 정의하는 것과 관련하여 파이썬 강의를 듣는 중이었다.

함수의 기능을 열심히 정의를 하고 나서 선생님이 꼭 마지막에 희한한 무언가를 붙이셨다.

그런데 그 코드에 대한 설명은 없으셔서 프로그래머들 사이에서는 기본적으로 알고 있는 지식인가 했다. 

그 코드는 아래와 같다.


-------------------------------

if __name__=="__main__":

        함수이름 ()

-------------------------------

 

if문이야 자주 보았던 문법이어서 그러려니 했는데, __name__과 __main__이라는 변수의 이름은 아주 생소했다. 

처음에는 그냥 그런가보다 하고 아무 생각 없이 선생님을 따라 똑같이 해당 코드를 붙여서 만들었는데,

그 작업이 반복되니까 갑자기 왜 붙이는 건지 궁금해졌다.

그래서 여러 블로그들을 열심히 찾아보고 코드도 실행해 보았다.

어째 한번에 땋! 하고 그렇구나 하게 설명해주는 블로그 글은 없었다. (나의 이해력 문제인걸까?ㅠ)

그래도 어찌 저찌 혼자서 이해하고 터득한 내용들을 블로그에 적어보기로 했다. 나와 동일한 궁금증을 갖고 있는 초보 엔지니어분들을 위한 작은 기록이다.

 

 

 

#2. __name__ 의 정체는 무엇인가? 바로 "파이썬의 내장변수 혹은 글로벌 변수"이다!

반응형

일단 __name__이라는 변수는 내가 변수로 만든 것이 아니라 원래부터 파이썬에서 정한 '이미 있는' 변수라고 한다.

이 변수에는 해당 파이썬 파일의 이름 즉, 모듈의 이름(예: function1.py이면 function1이  __name__이 됨)을 담게 된다.

그런데 "그 파일 안에서" 해당 함수를 실행시키면 __name__ 변수에 담기는 것은 그 파일 혹은, 모듈의 이름이 아니고 __main__이라는 값이 되도록 정해져 있다.

 

반면, 그 파일 안에서 그 함수를 실행시키는 것이 아니라

새로운 파일(import_function1.py)에서 function1.py라는 모듈을 import해서 가지고 와서 사용하는 경우에는 __name__변수에 그 모듈의 이름이 담긴다.

 

문장으로만 보면 좀 헷갈릴 수 있는데 코드로 보면 좀 더 감이 올 것이다.

 

 

 

#3. 코드로 이해하기

function1.py 라는 파일에 메인함수를 만들어 보았다. plus(a,b) 형태의 함수인데 a+b의 값과 모듈 이름을 print하게 만든 함수이다.

함수를 정의한 후에

if __name__=='__main__':

     plus(4,6)

이라고 적은 의미는: 해당 파일 자체를 실행하는 경우에는 plus(4,6)의 값을 나타내라는 의미이다.

바꿔 말하면, 해당 파일에서 해당 함수를 실행하는게 아니라 다른 파일에서 해당 함수를 실행한다면 plus(4,6)의 값은 나타내지 않아야 한다.

위 스크린샷을 보면 해당 파일에서 해당 함수를 실행했기 때문에 10 imported from __main__ 이라는 값이 출력 되었다.

그럼, 해당 파일이 아닌 다른 파일(import_function1.py)에서 function1 모듈을 불러와서 import해서 실행시키는 경우에는 어떻게 나올까?

모듈을 import만 했을 때는 아무일도 일어나지 않는다.

function1.plus(1,3)으로 function1 모듈에 있는 plus(a,b)함수를 실행시켜보았다.

그 결과는 4 imported from function1 이 된다. "__main__"이라는 값대신 모듈이름인 "function1"이 __name__ 변수에 담겼다는 것을 알 수 있다.

 

그렇다면, function1.py에서 if __name__=="__main__": 부분을 삭제하고 import 해서 실행하면 어떻게 될까?

*plus(4, 6)는 들여쓰기 없이 해당 모듈 안에 남겨져 있는 상태이다.

값이 2개가 나온다.

모듈 안에 있던 내용들(함수 정의, 그 함수를 실행시키는 파라미터 4, 6의 코드)이 모두 실행이 되고나서 그 다음에 함수를 적용시킨 코드(파라미터 1, 3의 코드)가 차례로 출력이 된 것이다.

10이라는 것 한줄  ---> 이것은 function1.py에 있던 것 그대로 plus(4,6)까지 다 실행한 결과이고,

4라는 것 한줄 ---> 이것은 function1.py의 함수에 plus(1,3)이 적용되어 실행된 결과이다.

 

이런 상황을 막기 위해 즉, import 했을 때 그 모듈안에 있는 모든 코드들이 그대로 실행되는 것을 막기 위해

if __name__=="__main__": 으로 메인 함수 선언을 해주어야 한다고 이해하면 될 것 같다.

 

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

댓글