is==의 차이

2줄 요약

is 는 레퍼런스 체크

== 는 값 체크

내용

Python에서 무언가를 비교할 때 is를 많이 쓰고 했다.

is== 모두 값을 비교한다는 것만 알고 이 둘을 별로 구분없이 사용했다.

>>> a = 1
>>> a is 1
True
>>> a == 1
True

여기까지는 당연하다

>>> a = 257
>>> a is 257
False
>>> a == 257
True

a is 257False를 반환하는 반면 a == 257True를 반환한다.

이것은 is는 레퍼런스를 비교하고 ==는 값을 비교하기 때문이다.

>>> id(a)
140316191538784
>>> id(257)
140316191538808

이와 같이 서로 다른 메모리 주소 값을 가지고 있기 때문에 위와 같은 결과가 나오게 된다.

>>> a = 1
>>> id(a)
140316194656296
>>> id(1)
140316194656296

a = 1을 하게 되면 메모리 주소가 같기 때문에 True를 반환한 것!

하지만 이는 Python Interpreter에서 [-5, 256] 범위의 Integer를 미리 캐싱(?)하고 있기 때문에 발생하는 일이다.

>>> def test():
...     a = 257
...     print a is 257
...
>>> test()
True

저렇게 컴파일 된 함수(?)안에서는 똑같은 메모리를 바라보고 있어서 True를 반환한다