정수를 is로 비교하는게 이상해요


파이썬 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까지의 수만 이런 결과가 나옵니다.

파이썬은 작은 정수와 큰 수를 저장하는 방식이 다른가요? 왜 이렇게 다른 결과를 내는 건지 모르겠습니다.

그럼 안정적으로 두 숫자를 비교하려면 어떻게 해야 되나요?

  • 2016년 01월 25일에 작성됨

조회수 356


1 답변


좋아요
0
싫어요
채택취소하기

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가 아니라 ==을 써 주세요.

  • 2016년 01월 25일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close