떼닝로그

[Python] " is None " vs " == None " 본문

개발로그/기타 이론 정리

[Python] " is None " vs " == None "

떼닝 2024. 11. 27. 18:31

[Python] " is None " 과 " == None " 간의 차이

https://www.geeksforgeeks.org/what-is-the-difference-between-is-none-and-none/

 

과외 준비하면서 릿코드를 풀어봤는데, 내 제출 코드가 비교적 시간이 많이 소요된 것으로 나왔다

다른 빠른 코드를 봤는데... 차이는 오직 내가 == None으로 적었던 것을 그 사람은 is None으로 적었다는 것의 차이

(물론 다른 것들도 있는데 내가 무시한 걸 수도 있다)

 

그럼 두 개 사이에 어떤 차이가 있길래 소요 시간에서 다르게 결과가 나오는 걸까? 싶어 글을 적어본다

나와 비슷하게 궁금증을 가진 사람들이 많아서 반가웠다. (사실 두 개의 차이에 대해 평생 모를 뻔도 했던)

 

미리 요약하자면,

> is None은 정체성을 파악한다. 즉, 객체 자체가 None인지를 확인한다.

> == None은 동일한지 여부에 대해 확인한다. 즉, 객체가 가지고 있는 값이 None인지를 확인한다.

 

어떠한 변수 또는 객체가 None인지 확인할 때 두 개를 모두 사용할 수는 있지만,

이것이 항상 성립하지는 않는다.

 

is None은 객체 자체가 None인지를 확인한다.

is None은 변수, 또는 객체가 정말 None을 가리키고 있는지 (존재하지 않는지)를 확인한다.

Python에서 None은 싱글톤 패턴을 갖추고 있다.

즉, 파이썬 메모리에는 오직 하나의 None만 존재하기 때문에 is None을 활용하는 것이 굉장히 효율적이다.

a = None

if a is None:
    print("a is None")
else:
    print("a is not None")
    
## 출력
## a is None

 

위의 is None은 a라는 객체가 None이라는 메모리 내 객체(파이썬 내에서 미리 정의된 것)와 동일한지를 확인한다.

객체의 정체성(?)과 직접적으로 비교를 하기 때문에, 비교적 속도가 빠르다.

 

== None은 객체가 가지고 있는 value(값)이 None과 일치하는지 확인한다.

== None은 객체의 값이 None과 일치하는지를 확인한다.

이는 값에 대한 equality(동일성) check으로, 객체 내의 __eq__ 함수를 사용하게 된다.

사실 is None보다 더 큰 범위에서 사용할 수 있으며,

사용자 정의 객체에서는 __eq__ 함수가 어떤 식으로 정의되었는지에 따라 다른 결과가 나올 수 있다.

a = None

if a == None:
    print("a is equal to None")
else:
    print("a is not equal to None")

## 출력
## a is equal to None

 

== 연산자는 a라는 값이 None이라는 값과 일치하는지를 확인한다.

이를 위해서는 class 내에 정의되어있는 __eq__ 함수를 사용하게 되면서 is None보다는 비교적 덜 효율적으로 확인한다.

 

 

결론

- is None은 객체 자체의 존재 여부를 확인하며, 비교적 효율적이다

- == None은 class 내에 정의되어있는 __eq__ method를 사용하여 확인한다. 사용자 정의가 가능하다.

Comments