id값(주소)을 비교
a = 12345
b = a
c = 12345
a is b # True
a is c # False
'is'는 비교 연산자가 맞지만, 변수의 값을 비교하는 것이 아니라 변수의 포인터(주소, 레퍼런스)를 비교하는 것이다.
값을 비교
a = 12345
b = 12345
a == b # True
Interning이란 이미 생성된 객체를 재사용하는 것을 말하는데, 보통 Immutable 객체에 대해 Interning을 사용한다. 파이썬은 기본적으로 몇가지 제한된 경우에 대해 디폴트로 Interning을 사용하고 있으며, 또한 개발자가 필요한 경우 함수를 써서 Interning을 지정할 수도 있다. 아주 많이 사용되는 Immutable 객체의 경우 Interning을 사용하게 되면 메모리를 줄일 수 있는 효과가 있다.
-5 부터 256 사이의 정수
a = 123
b = 123
a is b # True
c = 9587348547329
d = 9587348547329
c is d # False
20자 미만의 공백을 포함하지 않는 문자열 : [a-zA-Z0-9_]
문자열이 처음 생길 때 파이썬 내부적으로 table에 보관하고 같은 문자열을 생성할 때 이미 똑같은 문자열이 table에 있다면 새로 생성하지 않고 내부 table의 참조를 반환하여 같이 사용한다.
a = 'nameunzz'
b = 'nameunzz'
a is b # True
c = 'nameunzz!'
d = 'nameunzz!'
c is d # False
위 코드에서 !
가 들어간 문자는 False로 나온다. 이는 파이썬이 char라면 재활용할 수 있도록 하는 로직에서 [a-zA-Z0-9_]
만 포함하기로 되어 있기 때문이다.
이곳 블로그를 참고하면 더 자세히 나와있다!
아래 코드를 보면 할당을 각각 다른 줄에 했을 때와 같은 줄에 했을 때 주소가 달라진다. 이는 한번에 실행되었을 때 해당 값이 여러번 참조되는 상수라는 것을 컴파일할 때 알 수 있고, 같은 주소를 참조하게 만들어 재활용하기 때문이다.
a = 123456789
b = 123456789
a is b # False
a = 123456789; b = 123456789
a is b # True
c = 'nameunzz!'; d = 'nameunzz!'
c is d # True
is
는 가급적 상수(None, True, False 등)을 비교할 때만 쓰는 것이 좋다고 한다.
# Ex
if a is not None:
pass