반응형
질문
다음의 코드는 파이썬에서 예상치 못한 동작을 하는 이유는 무엇인가요?
>>> 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"에 대한 설명이 있습니다:
현재 구현은
-5
와256
사이의 모든 정수에 대해 정수 객체 배열을 유지합니다. 그 범위 내에서 int를 생성하면 실제로 기존 객체에 대한 참조를 반환합니다.
따라서 정수 256은 동일하지만 257은 그렇지 않습니다. 이는 CPython 구현의 세부 사항이며 다른 Python 구현에서는 보장되지 않습니다.
반응형
댓글