본문 바로가기
Python/INFO

[PYTHON] 파이썬의 is vs == 비교 정리

by 오늘은강박사갈거야~~ 2022. 6. 4.
반응형

 

이 글은 제가 공부하며 이해한 내용을 바탕으로 작성했습니다. 틀리거나 보완할 점이 있다면 댓글로 알려주시면 감사하겠습니다.

핵심 차이 요약

  • ==값(value) 을 비교
  • is객체(object)의 주소(id) 를 비교

빠른 예시 정리

# 리스트: 가변 객체

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

print(a == b)  # True (값이 같음)
print(a is b)  # False (다른 객체)
print(id(a), id(b))  # 서로 다른 주소
# 리스트 안의 숫자형 원소: 불변 객체

print(a[0] == b[0])  # True
print(a[0] is b[0])  # True (같은 숫자형 객체를 공유)
# 숫자형: 불변 객체

a = 134
b = 134

print(a == b)  # True
print(a is b)  # True (작은 숫자는 캐싱되어 동일 객체 사용)

내부 개념 정리

Dissecting memory mysteries of Python - Speaker Deck


파이썬에서
모든 것은 객체다. 숫자, 문자열, 리스트, 함수 등 모든 요소가 객체이며, 각 객체는 아래 3가지 속성을 갖는다:

  • Type: 객체의 자료형 (예: int, list, str)
  • Identity: 객체의 메모리 주소 (id()로 확인 가능)
  • Value: 객체가 담고 있는 값 (예: a = 1이면 1이 value)

이 세 가지는 객체를 비교하거나 판단할 때 기준이 되며, 이와 함께 객체의 가변성 여부is==의 결과에 영향을 준다. 아래에서 그 차이를 설명한다.. 그리고 객체의 구조가 가변인지 불변인지에 따라 is== 연산의 결과가 달라질 수 있다. 아래에서 이 부분을 더 자세히 다룬다.

(예: int, list, str)

  • Identity: 메모리 주소 (id()로 확인 가능)
  • Value: 객체가 담고 있는 값 (예: a = 1이면 1이 value)

가변 vs 불변

파이썬 객체는 크게 가변(mutable)불변(immutable) 으로 나뉜다. 이 특성에 따라 is== 의 결과가 달라질 수 있다.

  • 가변 객체 (mutable): 값이 같더라도 다른 객체로 존재 (예: 리스트, 딕셔너리, 집합 등)
  • 불변 객체 (immutable): 같은 값이면 동일한 객체를 가리킬 수 있음 (예: 정수, 문자열 등)

예를 들어 리스트는 가변 객체이기 때문에 a == b는 True여도 a is b는 False가 된다. 반면, 정수는 불변 객체라서 값이 같으면 is도 True가 될 수 있다 (특히 작은 숫자는 캐싱되기 때문에 더욱 그렇다).

예를 들어 리스트는 가변 객체이기 때문에 a == b는 True여도 a is b는 False가 된다. 반면, 정수는 불변 객체라서 값이 같으면 is도 True가 될 수 있다 (특히 작은 숫자는 캐싱되기 때문에 더욱 그렇다).

파이썬 객체는 크게 가변(mutable)불변(immutable) 으로 나뉜다. 이 특성에 따라 is== 의 결과가 달라질 수 있다.

  • 가변 객체 (mutable): 값이 같더라도 다른 객체로 존재 (리스트, 딕셔너리, 집합 등)
  • 불변 객체 (immutable): 같은 값이면 동일한 객체를 가리킬 수 있음 (정수, 문자열 등)

결론

  • is: 같은 객체인지 확인 (즉, 메모리 주소가 같은지)
  • ==: 값만 같은지 확인 (메모리 주소는 달라도 됨)

주의할 점

  • is는 보통 None 체크처럼 객체 식별용으로만 사용하는 것이 좋다.
  • if x is None: ...
  • 숫자형, 문자열 같은 불변 객체는 파이썬 내부에서 캐싱(interning) 되기 때문에 is가 True가 나올 수 있다. 하지만 이는 구현체나 상황에 따라 다르기 때문에, 의도적으로 is를 값 비교에 쓰는 것은 위험하다.
  • is: 같은 객체인지 (id가 같은지) 비교
  • ==: 값이 같은지 비교

참고

반응형

'Python > INFO' 카테고리의 다른 글

[PYTHON] pip이란?  (0) 2022.02.12
[PYTHON] pymssql 라이브러리  (0) 2022.02.11
[PYTHON] 리스트의 요소 종류와 개수 구하기  (0) 2021.09.18
[PYTHON]Namespace  (0) 2021.08.23
[PYTHON] JSONL(JSON LINES)형식  (2) 2021.07.29

댓글