is, == 비교

4239 단어 pythonpython

is

id값(주소)을 비교

a = 12345
b = a
c = 12345

a is b   # True
a is c   # False

'is'는 비교 연산자가 맞지만, 변수의 값을 비교하는 것이 아니라 변수의 포인터(주소, 레퍼런스)를 비교하는 것이다.



==

값을 비교

a = 12345
b = 12345

a == b   # True




예외 - Object Interning

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

좋은 웹페이지 즐겨찾기