반응형
이 글은 제가 공부하며 이해한 내용을 바탕으로 작성했습니다. 틀리거나 보완할 점이 있다면 댓글로 알려주시면 감사하겠습니다.
핵심 차이 요약
- == → 값(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 (작은 숫자는 캐싱되어 동일 객체 사용)
내부 개념 정리
파이썬에서 모든 것은 객체다. 숫자, 문자열, 리스트, 함수 등 모든 요소가 객체이며, 각 객체는 아래 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 |
댓글