본문 바로가기
Python/INFO

[PYTHON] IS 와 == 의 차이는 무엇인가?

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

- 이 글은 제가 공부를 하며, 이해한 것을 바탕으로 작성하는 글입니다.

- 그렇기에 틀리거나 잘못된 부분이 있을 수 있습니다.

- 글의 오류를 발견하시면, 댓글로 말씀해 주시면 정말 감사하겠습니다.

 


 

  • is는 변수가 같은 Object(객체)를 가리키면 True
  • ==는 변수가 같은 Value(값)을 가지면 True

[1] 개념

 

보통 python에서 같다는 것을 표현할 때 2가지 방법이 존재한다. is와 ==이다. 

 

일반적인 상황에서는 결과가 같다고 생각하여, 두 개를 혼용해서 사용할 수도? 있으나(아니다. 혼용은)

2가지는 완연히 다른 것이다. 

 

결론부터 이야기하면,  둘은 완전히 다르다! 같은 결과를 보일 때가 있을 뿐!

 == : 어떠한 두 변수가 같은 값(value)을 가지면 True를 반환
 is : 어떠한 두 변수가 같은 객체(object)를 가지면 True를 반환

 

해당 내용은 선수 내용이 필요하다. 빠른 답을 알고 싶어하는 사람을 위해 결과만 이야기하자면,

 

빠른 결론/예시

# is 와 == 는 다르다!
# is 는 객체의 id를 비교하므로 보이는 값이 같아 보여도 객체의 type에 따라 다른 결과가 나온다. 
# == 는 단순 보이는 객체의 값을 비교한다. 

ex1) 값이 같은 두 리스트 비교
a = [1,2,3]
b = [1,2,3]

print(a == b) # True 반환
print(a is b) # False 반환
print(type(a),type(b)) # <class 'list'> <class 'list'> -> 리스트는 가변 객체!
print(id(a), id(b)) # 3032549204288 3032549174592  # -> 가변 객체이므로 id 값이 다르다.


ex2) 값이 같은 두 리스트의 내부 원소 비교
a = [1,2,3]
b = [1,2,3]

print(a[0] == b[0]) # True 반환
print(a[0] is b[0]) # True 반환
print(type(a[0]),type(b[0])) # <class 'int'> <class 'int'> -> 리스트는 가변 객체이나, 해당 원소는 숫자형으로 불변 객체!
print(id(a[0]), id(b[0])) # 3032454293808 3032454293808  # -> 불변 객체이므로 id 값이 같다.


ex3) 값이 같은 두 숫자형의 비교
a = 134
b = 134

print(a == b) # True 반환
print(a is b) # True 반환
print(type(a),type(b)) # <class 'int'> <class 'int'> -> 숫자형은 불변 객체!
print(id(a), id(b)) # 3032454486544 3032454486544  # -> 불변 객체이므로 id 값이 같다.

 

 

이제 내부 자세한 내용은 아래와 같다.  

Dissecting memory mysteries of Python - Speaker Deck

 

파이썬은 모든 것이 객체이다. 숫자, 문자, 메서드  등 모든 것이 객체이다. 

 

 

그러한 개게는 위 그림과 같이 공통적으로 3가지의 정보를 가지고 있는데, 그것이 바로, Type, identity, value이다. 

우선 이 것들에 대한 이해가 필요한데, 

 

Type

- 객체가 어떤 종류(형태)인지 알려주는 정보로, 예를 들어, list, str, int, 등등등등 이 존재

- 이 것에 따라서  처리 및 저장 방식이 달라진다. 

- 우리가 코드를 짤 때 많이 사용하는 type() 이 바로 이 것을 return 하는 것임

 

Identity

- 쉽게 말하면 객체의 메모리 주소라고 할 수 있겠다.

- 메모리에 자기만의 고유한 주소를 가지는데, 그것을 identity라고 함. (짧게 id라고 부름)

- 한번 만들어지고 나면, 변경되지 않는다.

- id()를 사용하면 return 할 수 있다.

 

Value

- 이러한 주소에 저장되어 있는 것을 값, 즉 value라고 하는 것이다. 

- 단순하게 생각하자면, a = 1에서 1을 의미한다고 생각하면 된다. 

- 그런데, 위 그림을 보면, 값은 mutable, immutable 즉, 변하는 것(가변)과 변하지 않는 것(불변)으로 나뉜다. 뭐가 변할 수 있다는 것인가?

 

가변

값이 같은 것을 가지고 있는 객체라도, 각각의 객체들은 서로 다른 것!!! 즉, 각각의 객체는 각각의 identity(주소)를 가진다. 겉으로는 같아 보여도 다른 위치에 있는 다른 객체라는 것이다. 

예를 들어 집합, 리스트, 튜플, 딕셔너리 등이 있다. (이것들은 모두 컨테이너다. 여러 객체를 모아주는)

 

불변

같은 값일 경우 같은 객체를 참조하기 때문에 같은 identity(주소)를 가진다.

예를 들어, 문자형, 숫자형이 있다.

 

그렇다면, 어떠한 객체가 불변 객체냐, 가변 객체냐 에 따라서 is, == 의 결과가 달라진다는 것을 알 수 있다!

 

 

 

장황하게 설명한 것 같다.. 그럼 결론은 무엇인가?

 

결론!

 

is는 객체의 identity(주소)를비교하는 연산자!

==는 객체의 value(값)를 비교하는 연산자!

 

 

 

 

[2] 참조

How unique is Python's id()? - Stack Overflow

Dissecting memory mysteries of Python - Speaker Deck

3. 데이터 모델 — Python 3.10.4 문서

반응형

'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

댓글