본문 바로가기
Python

[Python] 파이썬 - 15. is와 == dml 차이

by Hoody Coder 2024. 11. 24.

파이썬에서 동일한 것을 비교하는 구문은 두 가지가 있다. 등호가 두 개 붙어있는 연산자 '=='와 파이썬 만의 고유 문법인 'is'가 존재한다.
보통 둘은 구분을 하지 않고 사용한다. 그럼, 이 두 연산자는 아무런 차이가 없을까? 다음 코드를 보자.

 

is: 두 객체의 메모리 주소가 같은지 (즉, 같은 객체인지) 여부를 확인한다.

- 예를 들어, a is bab가 같은 메모리 주소를 가리키는지 확인합니다.
- is 연산자는 동일 객체 참조 여부를 검사하는 데 사용됩니다.
- 참조 여부값까지 동일해야한다.

 

==: 두 객체의 값이 같은지 확인한다.

a == bab의 값이 동일한지를 비교합니다.
- == 연산자는 객체의 내용(값)을 비교합니다.
- A와 B의 참조값(메모리주소)의 동일 여부와는 상관없이 "값"자체의 일치 여부만 확인한다. 

아래는 여러가지 타입에 대한 is, == case를 정리한 내용이다. 

# 정수형
print(1 == 1)
# True
print(1 is 1)
# True

# -------------------------

# 문자열
print("abc" == "abc")
# True
print("abc" is "abc")
# True

# -------------------------

# None
print(None == None)
# True
print(None is None)
# True

# -------------------------

# 튜플
print(("a") == ("a"))
# True
print(("a") is ("a"))
# True

# -------------------------

# 리스트
print(["a"] == ["a"])
# True
print(["a"] is ["a"])
# False

# -------------------------

# dict형
print({"a": a} == {"a": a})
# True
print({"a": a} is {"a": a})
# False

# -------------------------

 

여기서 차이가 나는점은 int, str, 튜플 등과는 다르게 list와 dict형의 케이스에서는 is 와 == 의 결과값이 다르다는 것이다. 
이를 확실하게 알아보기위해 파이썬에서 고유값을 알려주는 id()값을 사용해서 확인해보자

a, b = 1, 1
c, d = [], []

print(id(a), id(b)) # 4315128040 4315128040
print(id(c), id(d)) # 4318353344 4318455552

정수형(int), 문자열(string), 튜플(tuple)과 같이 immutable(불변 값)한 객체 들은 python 내부에서 자동으로 같은 주소값을들 가지도록 최적화한다. (이때 캐싱, 싱글턴 객체 등을 활용한다)
따라서 위의 출력값에서 볼 수 있듯이, 같은 id를 가지게 되어 'a is b'는 True를 가지게 되는 것이다.

 

list나 dictionary, NumPy의 배열(ndarray)자료형은 mutable(속성 값을 수정할 수 있음)한 객체들이다. 이런 경우는 파이썬에서 개별적으로 각각의 객체를 만든다. 따라서 같은 값은 가졌다해도, 바라보고있는 참조값은 다르기때문에  'c is d'는 False를 가지게 되는 것이다.