Python에는 두 가지 비교 연산자가 있습니다: ==와 is. 이 둘은 비슷해 보이지만 완전히 다른 목적으로 사용되며, 이 차이를 이해하는 것은 버그 없는 코드를 작성하는 데 매우 중요합니다.
== 연산자: 값의 동등성 비교
== 연산자는 두 피연산자의 값(value)이 서로 같은지를 비교합니다. 즉, 두 객체가 메모리상에서 다른 위치에 있더라도 내용이 동일하다면 True를 반환합니다.
is 연산자: 객체의 동일성(정체성) 비교
is 연산자는 두 피연산자가 완전히 동일한 객체, 즉 메모리에서 같은 주소를 가리키는지를 확인합니다. Python의 내장 함수 id()는 각 객체의 고유한 메모리 식별자를 반환하며, a is b는 사실상 id(a) == id(b)와 같은 의미입니다.
예제 코드
아래 예제를 통해 두 연산자의 차이를 직접 확인할 수 있습니다.
list1 = [1]
list2 = [1]
list3 = list1
print(id(list1))
print(id(list2))
if (list1 == list2):
print("True")
else:
print("False")
if (list1 is list2):
print("True")
else:
print("False")
if (list1 is list3):
print("True")
else:
print("False")여기서 list1과 list2는 값은 같지만 별도로 생성된 서로 다른 리스트 객체입니다. 반면 list3 = list1은 새 객체를 만드는 것이 아니라 list1과 같은 객체를 참조하므로, 세 변수 중 list1과 list3만 동일한 객체입니다.
실행 결과
140380664377096 140380664376904 True False True
결과 분석
list1 == list2→ True: 두 리스트의 값(요소)이 [1]로 동일하기 때문입니다.list1 is list2→ False: 출력된id()값이 다르듯, 두 리스트는 서로 다른 메모리 주소에 있는 별개의 객체이기 때문입니다.list1 is list3→ True:list3은list1과 같은 객체를 참조하므로 동일한 객체입니다.
어떤 연산자를 사용해야 할까?
일반적인 값 비교에는 항상 ==를 사용해야 합니다. is는 x is None처럼 싱글턴(singleton) 객체와의 비교에만 사용하는 것이 권장됩니다. 특히 정수나 문자열처럼 작은 객체는 Python이 내부적으로 캐싱(interning)하기 때문에 is 비교가 우연히 True를 반환할 수 있어, 이를 값 비교 용도로 사용하면 예측 불가능한 버그를 유발할 수 있습니다.