개요
저번주 SQL 문제풀이를 하다가 = NULL 을 사용해 오류를 마주치고 = NULL 과 IS NULL 에 대해서 알아보았다
궁금한 사람은 링크요기
https://code-jong10.tistory.com/14
그래서 이번엔 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) 을 사용하기 때문에 True 와 False 를 기반으로 한 논리연산에서 직접 비교를 못하는거면 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 을 사용하자!!