정수를 is로 비교하는게 이상해요
조회수 3297회
파이썬 2.5.2를 실행시켰을 때
>>> a = 256
>>> b = 256
>>> a is b
True # 당연히 True
>>> 257 is 257
True # 257을 직접 비교하면 True
>>> a = 257
>>> b = 257
>>> a is b
False # 왜 False가 뜨죠?
같이 실행됩니다.
인터프리터 버전에 따라서 다른가 실험해봤는데 파이썬 2.3.3에서는 99~100까지의 수만 이런 결과가 나옵니다.
파이썬은 작은 정수와 큰 수를 저장하는 방식이 다른가요? 왜 이렇게 다른 결과를 내는 건지 모르겠습니다.
그럼 안정적으로 두 숫자를 비교하려면 어떻게 해야 되나요?
1 답변
-
Python Standard Library 5.3에 따르면
is
는 값이 아니라id()
를 비교합니다.그리고 Python documentation, 7.2.1, "Plain Integer Objects"에 따르면
파이썬은
[-5, 256]
까지의 정수는 정수 객체를 배열로 저장하고 있고, 이 범위의 int를 생성하면 이미 생성된 객체를 reference합니다.즉, 다음 파이썬 코드에서
>>> a = 256 >>> b = 256 >>> id(a) 9987148 >>> id(b) 9987148 >>> a = 257 >>> b = 257 >>> id(a) 11662816 >>> id(b) 11662828
a
,b
가 256을 저장했을 때는 [-5,256]까지는 이미 있는 객체를 reference 하므로 둘의 id가 같아is
로 비교했을 때 True가 나온 반면,257은 범위를 넘기 때문에 새로운 객체를 생성하므로 둘의 id가 달라,
is
로 비교했을 때False
가 return 됩니다.그러니까 값을 비교하는 경우에는
is
가 아니라==
을 써 주세요.
댓글 입력