|

파이썬 is와 == 차이: 객체 비교와 값 비교를 헷갈리지 않는 기준

파이썬 is와 == 차이를 설명하는 대표 이미지
object identity와 equality comparison 기준을 쉽게 정리한다

파이썬 is와 == 차이는 입문자부터 실무 초급까지 자주 헷갈리는 비교 문법입니다. 특히 어떤 때는 is가 맞는 것처럼 보이고, 어떤 때는 ==가 맞기 때문에 기준이 더 흐려지기 쉽습니다.

많은 설명이 이 주제를 is는 주소 비교, ==는 값 비교라고 요약합니다. 방향은 맞지만, 그대로 외우면 다시 헷갈리기 쉽습니다. 파이썬 공식 문서는 is를 object identity 비교로, ==를 equality comparison으로 설명하기 때문입니다.

즉, 핵심은 메모리 설명을 외우는 것이 아니라 지금 내가 같은 객체를 보려는지, 같은 값처럼 취급되는지를 보려는지를 먼저 구분하는 것입니다. 이번 글에서는 문자열, 리스트, None 비교까지 포함해 실전 기준을 정리하겠습니다.


왜 자주 헷갈릴까

이 주제가 특히 헷갈리는 이유는 is가 어떤 상황에서는 우연히 맞는 것처럼 보이기 때문입니다. 예를 들어 문자열이나 작은 정수 비교에서 is가 기대한 결과를 내는 것처럼 보이면, 많은 입문자가 is를 일반 비교 연산처럼 써도 된다고 착각하게 됩니다.

하지만 파이썬 공식 문서도 같은 값을 가진 리터럴 평가가 같은 객체일 수도 있고, 다른 객체일 수도 있다고 설명합니다. 즉, 어떤 예시에서 is가 맞았다고 해서 그것을 일반 규칙처럼 믿으면 안 됩니다. 문제는 문법 하나를 몰라서가 아니라, 같은 객체인지 확인하는 비교와 같은 값처럼 취급되는지 보는 비교를 섞어서 생각하기 때문에 생깁니다.


먼저 결론

  • is는 object identity 비교
  • ==는 equality comparison
  • None 비교는 is / is not를 우선 떠올리는 편이 안전하다

실전에서는 이렇게 기억하면 좋습니다. 값이 같은지 보고 싶다 -> ==, 같은 객체인지 보고 싶다 -> is, None인지 확인하고 싶다 -> is None. 아래 비교표를 먼저 보고 나서 본문을 읽으면 훨씬 덜 헷갈립니다.

파이썬 is와 ==를 object identity, equality, 문자열, 리스트, None 기준으로 비교한 표
파이썬 is와 == 빠른 비교표: object identity, equality, 문자열, 리스트, None 기준 요약

is와 ==가 실제로 보는 것

is는 object identity를 본다

파이썬 공식 문서 기준으로 is는 object identity 비교입니다. 즉, 두 변수가 같은 객체를 가리키는지를 보는 연산입니다.

a = [1, 2]
b = a

print(a is b)  # True

여기서는 ba와 같은 리스트 객체를 그대로 가리키고 있으므로 True입니다.

==는 equality를 본다

반면 ==는 두 객체가 같은 값처럼 취급되는지를 보는 비교입니다.

a = [1, 2]
b = [1, 2]

print(a == b)  # True

리스트 객체는 서로 다를 수 있지만, 내용이 같다면 ==True가 될 수 있습니다.

==는 타입 구현에 따라 달라질 수 있다

여기서 중요한 점은 ==가 항상 단순 값 비교라고만 볼 수는 없다는 것입니다. 파이썬에서는 객체 타입이 __eq__를 어떻게 정의했는지에 따라 equality 비교 결과가 달라질 수 있습니다. 즉, ==그 객체가 정의한 equality 기준을 따르는 비교라고 이해하는 편이 더 정확합니다.


문자열과 리스트 비교

문자열 비교

a = "python"
b = "python"

print(a == b)  # True
print(a is b)  # 어떤 환경에서는 True처럼 보일 수 있음

이 결과만 보면 문자열 비교에도 is를 써도 되겠다고 착각하기 쉽습니다. 하지만 이건 안전한 기준이 아닙니다. 공식 문서도 같은 값을 가진 리터럴이 같은 객체일 수도 있고, 다른 객체일 수도 있다고 설명합니다. 즉, 문자열 비교에서 is가 우연히 맞는 것처럼 보여도, 그 동작을 일반 규칙으로 믿으면 안 됩니다.

리스트 비교

a = [1, 2, 3]
b = [1, 2, 3]

print(a == b)  # True
print(a is b)  # False

여기서는 내용은 같지만 객체는 다릅니다. 그래서 ==True, isFalse입니다. 이 예시가 중요한 이유는 is==가 서로 대체 가능한 비교가 아니라는 사실을 한 번에 보여주기 때문입니다.

실전 기준

문자열과 리스트처럼 일반 값 동등성을 보고 싶을 때는 ==를 먼저 떠올린다. 그리고 is는 정말로 같은 객체인지 확인해야 할 때만 씁니다.


None 비교

None 비교는 이 글에서 별도로 봐야 할 만큼 중요합니다. PEP 8은 None 같은 singleton 비교에 == 대신 is 또는 is not를 권장합니다.

if value is None:
    print("값이 없습니다")

이렇게 쓰는 이유는 단순한 스타일 문제가 아닙니다. None은 일반 값 비교 대상이라기보다, 특정 singleton 객체를 가리키는 의미로 다루는 편이 더 분명하기 때문입니다. 즉, None 비교는 파이썬에서 is를 가장 먼저 떠올려야 하는 대표적인 상황입니다.


실무 기준

  • 일반 값 비교는 ==
  • 같은 객체인지 확인할 때만 is
  • None 비교는 is / is not
  • 작은 정수나 문자열에서 우연히 맞는 is 결과를 일반 규칙처럼 믿지 않는다

즉, 파이썬 is와 == 차이는 문법 차이라기보다 지금 같은 객체를 보려는지 같은 값을 보려는지의 차이로 이해하는 편이 정확합니다.


자주 하는 실수 4가지

  1. 문자열 비교에 is를 쓰는 실수
  2. 리스트 내용을 is로 비교하는 실수
  3. None 비교를 ==로 쓰는 습관
  4. 우연히 맞은 결과를 일반 규칙처럼 믿는 실수

한 번에 기억하는 기준

파이썬 is와 == 차이는 문법 차이가 아니라, 지금 같은 객체를 보려는지 같은 값을 보려는지의 차이입니다. 같은 객체인가 -> is, 같은 값처럼 취급되는가 -> ==, None인가 -> is None. 이 기준을 먼저 떠올리면 is==는 훨씬 덜 헷갈립니다.


마무리

파이썬 is와 == 차이는 단순 비교 연산자 차이처럼 보이지만, 실제로는 객체 동일성과 값 동등성을 구분하는 기본 주제에 가깝습니다. 그래서 이 기준을 정확히 이해하면 문자열 비교나 리스트 비교 실수만 줄어드는 것이 아니라, None 비교 같은 파이썬다운 코드 습관도 함께 정리할 수 있습니다.

관련해서 비교 문법을 다른 언어와 함께 보고 싶다면 자바 ==와 equals 차이 글도 함께 읽어보면 좋습니다. 공식 기준은 Python comparisons 문서, literals and object identity 문서, PEP 8을 참고하면 됩니다.

함께보면 좋은 글