본문 바로가기
Python/Python FAQ

Python "정수와 함께 'is' 연산자는 예상치 못한 방식으로 작동합니다.", "is" operator behaves unexpectedly with integers

by 베타코드 2023. 9. 10.
반응형

질문


다음의 코드는 파이썬에서 예상치 못한 동작을 하는 이유는 무엇인가요?

>>> a = 256
>>> b = 256
>>> a is b
True           # 이는 예상한 결과입니다
>>> a = 257
>>> b = 257
>>> a is b
False          # 여기서 무슨 일이 일어났나요? 왜 False인가요?
>>> 257 is 257
True           # 그럼에도 불구하고 리터럴 숫자는 제대로 비교됩니다

저는 Python 2.5.2를 사용하고 있습니다. Python의 다른 버전을 몇 가지 시도해보면, Python 2.3.3에서는 99와 100 사이에서 위와 같은 동작을 보입니다.

위를 기반으로 가설을 세울 수 있습니다. 파이썬은 "작은" 정수와 큰 정수를 다른 방식으로 저장하는 내부 구현을 하고 있으며, is 연산자는 이 차이를 알 수 있습니다. 왜 이러한 불완전한 추상화가 있는 걸까요? 미리 숫자인지 아닌지를 알 수 없는 두 개의 임의의 객체를 비교하여 같은지 확인하는 더 좋은 방법은 무엇인가요?


답변


이것을 살펴보세요:

>>> a = 256
>>> b = 256
>>> id(a) == id(b)
True
>>> a = 257
>>> b = 257
>>> id(a) == id(b)
False

여기에는 "Plain Integer Objects"에 대한 설명이 있습니다:

현재 구현은 -5256 사이의 모든 정수에 대해 정수 객체 배열을 유지합니다. 그 범위 내에서 int를 생성하면 실제로 기존 객체에 대한 참조를 반환합니다.

따라서 정수 256은 동일하지만 257은 그렇지 않습니다. 이는 CPython 구현의 세부 사항이며 다른 Python 구현에서는 보장되지 않습니다.

반응형

댓글