파이썬에서 비교 연산자는 is 와 == 가 있습니다.
파이썬의 id() 함수는 Object의 identity(id)를 정수로 반환합니다.
is 는 이러한 Object의 id() 를 비교합니다.
반면에 ==는 Object의 Value(값) 을 비교합니다.
이렇게 보면 파이썬에서 Object를 어떻게 정의하고 어떠한 속성을 가지고 있는지 먼저 알아봐야할것같습니다.
그럼 파이썬 공식문서를 찾아보겠습니다.
Objects are Python’s abstraction for data. All data in a Python program is represented by objects or by relations between . objectsEvery object has an identity, a type and a value.
(번역)
객체는 파이썬이 데이터를 추상화 한 것입니다.
파이썬의 모든 데이터는 객체 또는 객체 간의 관계로 표현합니다.
모든 객체는 identity, type, value를 갖습니다.
참조 : https://docs.python.org/3/reference/datamodel.html
이렇듯 파이썬은 모든 것이 객체입니다.
이제 객체의 속성들에 대해 알아보겠습니다.
흔히 우리가 말하는 아이디 입니다. 아아디는 고유값으로 메모리상의 객체의 주소를 말합니다.
그렇기에 아이디는 불변값을 가집니다.
변수에 어떤 type 이 들어가있는지에 따라 저장하는 방식이나 계산하는 방식이 달라집니다.
예를 들면 a=1 이라는 정수형 변수의 메모리 크기는 28 이지만, a='1' 이라는 문자열 변수의 메모리는 50 입니다.
값에는 변할 수 있는 가변값이 있고 불변값이 있습니다. 가변,불변 여부는 type 에 의해서 결정됩니다. 가변객체에는 리스트, 딕셔너리, 집합 등이 있고 불변객체에는 숫자,문자열 등이 있습니다.
파이썬의 모든 데이터는 객체이고 그 객체가 가지는 속성들에 대해 알아봤습니다.
코드를 보며 더 알아 보겠습니다.
a = ["mincheol"]
b = ["mincheol"]
print(a == b)
True
print(a is b)
False
print(id(a), id(b))
140483155808128 140483155807616
a,b 는 가변객체인 리스트를 사용하여 불변 객체인 문자 "mincheol" 을 가지고 있습니다.
== 연산자를 이용해 a 와 b 의 value 를 비교하면 같은 값을 가지고 있기에 True 를 반환합니다.
그러면 이제 id 를 is 로 비교해 보겠습니다.
같은 값을 가지고 있지만 id는 다른값을 가지고 있기에 False 를 반환했습니다.
파이썬에서 가변객체는 같은 값이라도 독립성을 보장하기에 각각 다른 객체를 참조합니다. 즉 모든 가변 객체는 identity 가 부여됩니다.
다음은 불변객체의 비교를 보겠습니다.
c = "mincheol"
d = "mincheol"
print(c is d)
True
print(c == d)
True
print(id(c))
4529146848
print(id(d))
4529146848
불변 객체는 값뿐만아니라 id 또한 같음을 볼 수 있습니다.
파이썬에서 불변객체는 같은 값일 경우 같은 객체를 참조하기 때문에 같은 id를 가지게 됩니다.
그렇다면 가변객체 안에 불변객체를 비교하면 어떤 결과가 나올까요?
print(a[0] is b[0])
True
print(id(a[0]), id(b[0]))
140319989446512 140319989446512
리스트는 가변객체이면서 컨테이너 이기도 합니다. 컨테이너란 다른객체의 참조를 값으로 가지는 형태를 말합니다. 방금 말한 리스트말고도 딕셔너리, 튜플이 컨테이너에 해당합니다.
즉 컨테이너들은 다른 객체의 참조 값을 모아둔 형태이기에 각 요소의 객체들은 고유의 특성을 유지하게 됩니다.
그렇기에 여기선 불변객체의 특성을 계속 유지하게 됩니다.
마지막으로 널(null) 로서 값 자체가 정의되어 있지 않은 None 은 어떤 비교연산자를 써야할까요 ?
당연히 is 를 써서 비교합니다. 값 자체가 없기때문에 == 는 비교가 불가능합니다.
if a is not None:
print("Good")
Good