Python3/Python3 language

[Python3] Python에서의 False와 None은 같은 것인가?

Razelo 2021. 8. 14. 11:13

특정 코드를 보던 중에 파라미터로 넘어온 값을 not 으로 if문에서 판별해주는 구문이 있었다. 

해당 전달값이 False라면 if문을 실행하고, True라면 if문을 실행하지 말라는 뜻으로 해석했는데, 그런데 None이 들어오면 어떻게 되는거지? 라는 생각이 들었다. 물론 똑같이 None이 온다면 False일때와 같이 동작하는 것이 당연하다고 생각이 들었지만, 그렇다면 조건에서 False True 를 체크할때만 None은 False로 동작할 수 있는건가? 아니면 실제로 같이 취급되는 것인지에 대해 궁금해졌다. 

 

따라서 간단한 코드 몇줄로 확인해볼 수 있었다. 

print(None == False)

우선 해당 코드는 False가 나온다. 즉 None은 False가 아니다. 아예 다른 존재다. 

 

그렇다면 어떤 타입일까? 

print(type(None))

결과는 <class 'NoneType'> 이 나온다. 

 

print(type(False))

그리고 역시나 False를 확인해보면 예상대로 <class 'bool'> 이 나온다. 

 

다만 이제 중요한 것은 분기문에서 사용할때 NoneType도 False로 작동한다는 것이다. 즉 0, None, '' 은 분기문에 들어갈 경우 False로 취급된다.  (다른 언어에서 null일 경우 False로 취급된다는 것을 생각해보면 None이 똑같은 방식으로 동작하는 것은 마찬가지이다. None또한 아무것도 없음을 의미하기 때문이다. )

 

그렇다면 그냥 이렇게 None을 분기에서 None이냐 아니냐를 판별해주는게 코드 상 좋은 것일까? (꼭 파이썬이 아니라면 null이냐 아니냐)

 

상황에 따라 다를 수 있지만, 대개  두가지 상황으로 이야기할 수 있다. 

head = None 

if head:
    print("None")
else:
    print("not None")

위와 같은 코드가 있다고 가정하자. 

 

head에는 None으로 주었으니 당연히 not None이 출력될 것이다. 하지만 타입을 추론하기 어려운 경우에는 위와 같은 방식이 좋지 않을 수 있다. 

 

따라서 

head = None 

if head != None:
    print("None")
else:
    print("not None")

이렇게 적어주는 것이 좀 더 명확하다.

 

꼭 파이썬이 아니더라도 c나 c++에서 해당 변수가 pointer인지 bool타입인지 정확하게 인지할 수 있는 여건이라면 굳이 위처럼 적지 않아도 된다. 그럴때는 그냥 파이썬에서 if head: 처럼 적는 것처럼 c/c++에서도 마찬가지로 적어주면 된다. (그런데 C/C++에서 이렇게 if head 처럼 bool타입 변수 하나를 가지고 조건체크를 하는게 가능했었는지 불가능했었는지 기억이 가물가물하다. 아마 안됬던걸로 기억한다.)

 

하지만 타입이 무엇인지 코드를 작성할 적에 명확히 인지하기 어려운 경우 명시적으로 적어주는 것이 좋겠다. 즉

p != null 와 같은 방식으로 말이다. 

 

참고로 조건문의 조건에서 그것의 타입을 명확히 인지하기 어려운 경우는 if (foo()) { ~ } 와 같은 경우가 있을 수 있다. 물론 조건문에서는 무조건 참과 트루가 와야하는 것이 맞기에 사실 큰 상관은 없다라고 생각하지만 좀 더 명시적으로 적어주는 편이 좋다고 생각한다. 

 

또한 마찬가지로 언어와 상관없이 어떤 언어이던지 엄격한 컴파일러를 사용하는 언어라면 위와 같은 코드가 좀 더 낫다.

반응형