파이썬 프로그래밍에서 is 연산자와 ==(equals) 연산자는 겉보기에 비슷하게 동작하는 것처럼 보이지만, 실제로는 완전히 다른 목적을 가진 연산자입니다.
- == 연산자: 두 변수의 값이 서로 같은지를 비교합니다.
- is 연산자: 두 변수가 동일한 객체(메모리상의 같은 주소)를 가리키고 있는지를 확인합니다.
즉, ==는 '내용이 같은가'를 묻는 반면, is는 '정말 같은 객체인가'를 묻는 연산자라고 이해하면 됩니다.
예제 코드
# Python program to
# illustrate the
# difference between
# == and is operator
# [] is an empty list
list1 = []
list2 = []
list3 = list1
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")
실행 결과
True False True
결과 분석
list1 == list2→ True
두 변수 모두 빈 리스트([])로, 내용(값)이 동일하기 때문에==비교 결과는 True입니다.list1 is list2→ Falselist1과list2는 각각 별도로 생성된 서로 다른 리스트 객체입니다. 값은 같아도 메모리상에서 서로 다른 위치에 존재하므로is비교 결과는 False입니다.list1 is list3→ Truelist3 = list1구문은 새로운 객체를 만드는 것이 아니라list1이 가리키는 객체의 참조를 복사합니다. 따라서 두 변수는 완전히 동일한 객체를 공유하므로is비교 결과는 True입니다.
추가 팁: id() 함수로 객체 확인하기
id() 함수를 사용하면 각 객체의 고유한 식별자(메모리 주소)를 직접 확인할 수 있습니다.
print(id(list1)) print(id(list2)) print(id(list3))
위 코드를 실행해 보면 list1과 list3의 id 값은 같고, list2의 id 값만 다르게 출력됩니다. 이것이 is 연산자가 실제로 비교하는 대상입니다.
정리
값의 동등성을 검사할 때는 ==를, 객체의 동일성(참조 여부)을 검사할 때는 is를 사용하는 것이 올바른 파이썬 코딩 습관입니다. 특히 None과의 비교 시에는 관례적으로 x is None 형태를 사용하는 점도 함께 기억해 두면 좋습니다.