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

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

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

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

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.