궁금증 연구소

안녕하세요. 궁금증연구소입니다.

오늘 포스팅 주제는 "is, == 의 차이점"입니다.

 

# is 와 == 의 차이점

a = [1,2,3]
a==a  ;;; True
a is a ;;; True
a == list(a) True
a is list(a) False

값은 동일하지만 list로 한번 더 묶어주면 별도의 객체로 복사되고, 다른 ID를 갖게 된다.

b = [1,2,3]

b == copy.deepcody(a)  ;; True
b is copy.deepcody(a)   ;; False

복사의 결과 값은 같지만, ID는 다르기 때문에 ==로 비교하면 True, is로 비교하면 False

파이썬은 객체지향 언어이다. 사실 객체지향에 대해서 읽어보고, 학원 선생님에게도 들어보고, 유튜브도 찾아보았지만 아주 두루뭉술하게만 이해가 된다. 내 수준에서 할 수 있는 이해의 한계라는 것이 존재하는 것 같다. 물론 코딩을 더 깊게 공부하다 보면 이해되는 순간이 오게 되겠지만...

 

내가 이해하는 바를 정리해보자면

 

C언어나 어셈블리어 같은 프로그래밍 언어는 좀 더 low 레벨의 언어이다.

컴퓨터는 어차피 0과 1로 이루어진 이진수로 소통한다. 그렇다고 사람이 이진수를 써서 코딩을 하는 데는 어려움이

많아서 만들어 낸 것이 프로그래밍 언어이다. 그 언어들 중 C언어나 어셈블리어는 좀 더 컴퓨터 친화적인 언어이다. 당연히 사람 입장에서 코딩하는 난이도는 올라가지만, 컴퓨터가 알아먹는 절차나 과정이 단순하기 때문에 속도가 빠르다. 반면, 속도를 조금 포기하더라도 코딩의 속도와 편의성을 높인 것이 파이썬과 같은 객체지향 언어이다. 물론 C언어에도 C#이나 C++ 같은 객체지향적 속성을 넣은 언어가 있긴 하다(고 들었다.. 사실 1도 모른다..)

 

아무튼 이번 포스팅의 목적은 그게 아니라(갑자기 태세 전환 죄송하다..) is, ==를 이해하는 것이다.

 

==는 조건문에서 많이 보는 기호이다. 

 

if a % 2 == 0 :
	print('짝수입니다.')

예를 들어 이런 식으로 많이 쓴다. 즉 ==는 양쪽의 변수가 같은 값을 가지는지 비교할 때 쓴다.

 

x = [1,2,3,4]

x == y

z = [1,2,3,4]

 

x와 y는 같다고 했으므로 당연히 둘 다 [1,2,3,4]라는 값을 가진다. 즉 x==y는 True가 된다. z 또한 같은 값을 가지므로 

x==z라고 쓰면 당연히 True이다.

 

 

그렇지만 x is z라고 하면 틀린 말이 된다. is는 id() 함수를 통해 알 수 있는 객체의 주소 값이 같은지, 즉 같은 객체를 가리키고 있는지를 말하기 때문에 틀린다. ( 리스트 객체는 값이 같더라도 다른 변수에 담겨 있으면 객체의 주소값이 달라진다.)

 

is의 개념

위 예를 살펴보자.

x, y, z는 "값"의 입장에서 보면 모두 같다. 즉 x==y==z이다. 

그렇지만 x, y, z를 가리키고 있는 객체의 주소 입장에서 보면 x, y는 같지만 z는 다른 주소를 가지고 있다.

 

따라서 x is z는 False가 된다.

 

정리

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

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading