Q. Comparison Operator "=="과 Identity Operator "is"의 차이는?
A. "=="는 값만 비교, "is"는 같은 메모리 주소인지 비교한다.
공식문서 참고: https://docs.python.org/3/reference/expressions.html#is-not
is와 is not은 id() 함수로 결정되는 객체의 identity를 따진다.
그리고 id()는 객체의 메모리 주소를 찾는다.
파이썬의 immutable 객체는 값이 같으면 같은 메모리 위치를 재사용하는 경우가 많아서 is 연산의 결과가 True가 되는 경우가 많다.
위와 같이 튜플과 리스트로 테스트한 결과, 리스트(=mutable 객체)는 같은 타입/값이라도 False를 반환한다.
또 같은 값, 같은 타입이라고 하더라도 아래와 같이 변수 a, b와 같이 서로 다른 이름으로 할당하면 is는 False를 반환한다. (a와 b가 서로 다른 주소에 위치하기 때문이다.)
🎯 정리: 언제 is를 써야 할까?
✅ is를 사용해야 하는 경우:
🚫 is를 쓰면 안 되는 경우:
결론적으로, 대부분의 경우 ==를 쓰는 게 맞고, is는 객체가 진짜 같은 메모리 주소를 공유하는지 확인할 때만 쓰는 게 좋다!
🔗 공식 문서 및 출처
1️⃣ 파이썬 공식 문서 (Python is 연산자 설명)
📌 is는 객체의 동일성(identity) 을 비교하는 연산자로, 두 변수가 동일한 객체를 가리킬 때 True를 반환한다고 설명하고 있어.
🔗 https://docs.python.org/3/reference/expressions.html#is-not
2️⃣ 파이썬 데이터 모델 (싱글톤 객체 None, True, False의 고유성)
📌 None, True, False는 파이썬 실행 내내 같은 객체를 공유하므로, is로 비교해야 한다고 나와 있어.
🔗 https://docs.python.org/3/library/constants.html
3️⃣ 파이썬 정수 및 문자열 캐싱 (CPython 최적화 기법)
📌 -5 ~ 256 범위의 정수는 캐싱되므로 is 비교 시 True가 나오지만, 그 외의 정수는 그렇지 않을 수도 있다는 내용이 있음.
🔗 https://docs.python.org/3/c-api/long.html#c.PyLong_FromLong
4️⃣ 파이썬 공식 FAQ (객체 동일성 is와 값 비교 == 차이점)
📌 is는 객체 자체가 동일한지를, ==는 값이 같은지를 비교한다고 명확하게 설명되어 있어.
🔗 https://docs.python.org/3/faq/design.html#how-does-is-differ-from