[Python] is 와 == 그리고 객체

김민철·2020년 11월 26일
1

파이썬에서 비교 연산자는 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

이렇듯 파이썬은 모든 것이 객체입니다.

이제 객체의 속성들에 대해 알아보겠습니다.

identity

흔히 우리가 말하는 아이디 입니다. 아아디는 고유값으로 메모리상의 객체의 주소를 말합니다.

그렇기에 아이디는 불변값을 가집니다.

type

변수에 어떤 type 이 들어가있는지에 따라 저장하는 방식이나 계산하는 방식이 달라집니다.

예를 들면 a=1 이라는 정수형 변수의 메모리 크기는 28 이지만, a='1' 이라는 문자열 변수의 메모리는 50 입니다.

value

값에는 변할 수 있는 가변값이 있고 불변값이 있습니다. 가변,불변 여부는 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

0개의 댓글