Python/Insights

[Python] is None 과 == None

죵욜이 2024. 11. 14. 03:26

개요

저번주 SQL 문제풀이를 하다가  = NULL  을 사용해 오류를 마주치고  = NULL 과  IS NULL 에 대해서 알아보았다

궁금한 사람은 링크요기

https://code-jong10.tistory.com/14

 

' = NULL ' (X) ' IS NULL ' (O)

개요프로그래머스 에 있는 SQL 문제를 풀다가 어이없는 실수를 하였다. 이 문제를 보고SELECT ANIMAL_ID # 틀린거임FROM ANIMAL_INSWHERE NAME = NULLSELECT ANIMAL_ID # 틀린거임FROM ANIMAL_INSWHERE NAME = "NULL"이런식으

code-jong10.tistory.com

 

그래서 이번엔 Python 의 경우 무엇이 다르고 어떤게 옳은것인가? 에대해 알아볼것이다.

 


 

먼저 파이썬에서  의 의미는 SQL 과 다르다

SQL 에선 비교연산자로  가 사용되었지만 Python 의 경우 할당연산자이고 비교연산자로는  ==  가 사용된다.

또한 Python 은  NULL  과 비슷한 개념으로  None  이 존재하지만 이는 '값이 없음' 을 나타내는  객체  이다.

 

그래서 먼저 이 두개를 알아보고자한다.

 

 

1.  (할당 연산자)

변수에 값을 할당할때 사용된다.

x = 10     # 변수 x 에 값 10 을 할당

 

오른쪽의 값을 왼쪽의 변수에 저장한다고 생각하면 된다.

 

 

2.  ==  (비교 연산자)

  • 두 값이 같은지 비교할 때 사용
  • True 또는 False 를 반환
x = 10
y = 10
z = 20

print(x == y)     # True
print(x == z)     # False

 

 

차이점 요약

  •  =  : 값을 할당할 떄 사용한다.
  •  ==  : 두 값을 비교할 때 사용한다.

 


파이썬에서  None  비교

 

 is [not] None  을 사용해서 비교 합니다. 

 

그렇다면 여기서  ==  라는 비교연산자를 사용하면 안되고  is  를 사용하라했으면  is  의 역할에 대해 궁금하실겁니다.

 

 

 is 

 is 식별연산자 (identity operator) 로써 두 객체가 같은 객체인지를 확인할때 사용된다.

두 객체가 메모리에서 동일한 위치를 참조하는지, 즉 객체의 식별성을 비교하는 연산자 입니다.

 

따라서  is  는 값이 아니라 객체 자체의 동일성을 비교합니다. 값이 같더라도, 객체가 다른 위치에 있을 수 있기 때문에

 == (값 비교),  is (식별 비교) 는 다릅니다.

x = [1, 2, 3]
y = [1, 2, 3]

print(x == y)     # True : 값이 같음
print(x is y)     # False : 서로 다른 객체

 

 

 

그렇다면 맨 위 링크 SQL 에서 Null 을 공부하고 오신분들은 궁금증이 생기실겁니다.

 

" SQL 에서  Null 3가논리(True, False, Unknown) 을 사용하기 때문에 TrueFalse 를 기반으로 한 논리연산에서 직접 비교를 못하는거면 Python 의  None  도 똑같은 개념인건가? "

 

라고 물으시면  X  

 

완전 똑같은 개념은 아닙니다.

 

파이썬에서  None 3가지 논리를 사용하는것은 아닙니다.

 

파이썬 에서  None 특별한 객체로, 값이 없음 또는 정의되지 않음 을 나타냅니다.

 None 단 하나의 객체이고, 모든  None  값은 동일한 객체를 참조합니다.

 

따라서 파이썬에서  None  을  is  로 비교하는 이유는  None  이 객체이기 때문입니다.

 is 객체의 동일성을 비교하는 방식이므로,  None 과의 비교에서 더욱 정확하고 안전합니다.

 

그렇다면 방금 '더욱 정확하고 안전' 하다고 하였고 3가논리가 아니면  == 도 사용가능한거 아니야?

라는 의심을 하실수도있습니다.

 

이 질문을 하시면 O

 

파이썬 에서  None 불린 논리(boolean logic) 을 사용해 처리합니다

 None 불린 값으로 평가될때 False 로 간주되며

조건문에서도 False 로 취급됩니다.

a = None
print(bool(a))     # False : None 은 불린 값으로 평가 시 False 로 간주

 


결론

 

따라서 식별연산자  is 비교연산자  ==  를 사용해  None  과 비교가 가능은 합니다.

a = None

print(a is None)     # True
print(a == None)     # True

 

위의 코드 둘다 True 를 반환하지만 그 의미는 다릅니다.

  •  is 객체의 동일성 을 비교하고
  •  ==  이 같은지 비교합니다.

 

 None 값이 없음 을 나타내는 고유한 객체이기 때문에 두 비교 모두 True 로 평가되지만, 

일반적으로  None  을 비교할 때는  is  를 사용하는것이 더 명확하고 권장되는 방식입니다.

 

 

게다가 파이썬 코딩 컨벤션인  PEP8(Python Enhance Proposal)  에서는

 if number == None  보다  if number is None  과 같은 방법을 더 권장합니다.


한줄요약

 is None  을 사용하자!!