[python] "is" 와 "==" 차이 | Server Side

Python에 있는 비교문 중에 is 와 == 의 차이를 알아보자.

둘다 비교문이지만 잘못 사용하면 다른 결과가 나온다. 우선 예제를 보자.


# is 사용
a = 1
b = 1
>>> a is b
True


a = "str"
b = "str"
>>> a is b
True


# == 사용
a = 1
b = 1
>>> a == b
True


a = "str"
b = "str"
>>> a == b
True



동일하게 모두 숫자나 문자 둘다 비교해 봐도 둘다 True 가 나온다.

차이가 없다. 과연그럴까 아래 예제를 보자.


# == 사용
a = "This is Anfield, This is Anfield, This is Anfield"
b = "This is Anfield, This is Anfield, This is Anfield"
>>> a == b 
True


a = 12345789130
b = 12345789129 +1
>>> a == b
True


# is 사용시
a = "This is Anfield, This is Anfield, This is Anfield"
b = "This is Anfield, This is Anfield, This is Anfield"
>>> a is b
False


a = 12345789130
b = 12345789129+1
>>> a is b
False

엇? 동일한데 예상과는 다르게 같은 값인데도 불구하고 is 를 사용했을때는 false 가 나온다.


이유를 알아보자.

is 는 비교연산자가 맞기는 맞다!

사실 is 는 == 와 달리 값을 비교하는게 아니라 레퍼런스 즉 포인터를 비교한다.

맞다 그 C 의 그 포인터...


Python 에서 변수는 내부적 으로 데이터를 가르키는게 아니라 인스턴스 포인터를 가르킨다.

그러나 C에서 처럼 액세스를 할수는 없다.


그럼 이제 위 예제에서 왜 False 가 나오는지 보면 우선 긴 문자열을 변수에 대입시키면

새로운 메모리 공간이 할당된다.

그러면 두 변수는 서로 다른 메모리 할당을 받기 때문에 서로 포인터가 다르기에 False가 나온다.


아래 숫자도 마찬가지도 +1로 계산을 하면 값은 같지만 메모리 할당공간이 서로 다르다.

인스턴스 값을 비교하는 is 연산자는 당연히 두변수의 인스턴스 값이 다르기 때문에 False 를 반환한다.

 

이러해서 'is' 연산자는 포인터(레퍼런스)를 비교하는 연산자이지 데이터를 비교하는 연산자가 아니라점을

확인할수 있다.


고로 is 연산자는 가급적 None, True, False 등을 비교할때 사용하자.








Python, is, ==, 비교문
Comment Write
Comment List
davidkim 2018.05.29 11:44              
a=10 b=9+1 print(a is b) 하면 왜 True가 나오나요...?
reply_arrow 토리 2018.06.07 13:12         
a = 10 이랑 b = 9+1 은 둘다 10이므로 True가 맞습니다. 위 예제에서 설명한 숫자는 int의 범위를 넘어가는 값을 비교했을때 값이 아니라 레퍼런스를 비교한다는 의미로 작성되었습니다.