>>> a=-5
>>> a is -5
>>> True
>>> a=-6
>>> a is -6
>>> False
위 예제에서 -5, -6 대신 -1, -2를 넣었더니 결과는 True, True가 나옵니다. 값에 따라 결과가 달라지는 이유는 무엇인가요?
본문 설명에서 <메모리 주소가 달라질 '수' 있기...>에 해당하는 부분인 듯한데, 정확히 어떤 이유때문인가요?
숫자 비교에 is를 쓰면 안 됩니다.
쓰지 말라는 것이니 잘못된 코딩이고 안 해야 하는 사항입니다.
이를 실험하는 것은 의미가 없습니다.
그래도 굳이 실험을 한다면
>>> a = -5
>>> a is -5
True
>>> a = -6
>>> a is -6
False
>>> a = -1
>>> a is -1
True
>>> a is -6
False
>>> a = -6
>>> a is -6
False
>>> id(a)
2384676894256
>>> a = -1
>>> id(a)
1846307808
>>> a is -1
True
>>> a = -6
>>> id(a)
2384676894256
>>> a is -6
False
>>> id(-6)
2384676896240
>>> id(-1)
1846307808
>>>
값이 아니라 객체를 비교하기 때문에 객체 ID값이 같을 때는 True이고, 아닐 때는 False입니다.
메모리 주소가 달라질 수 있어서 다른 객체로 인식한다면 같은 정수여도 다른 객체라는 말이 되는 데요. 이렇게 이해해도 되는지요?
is는 숫자와 비교하기 위해 쓰는 게 아닙니다.
https://python.bakyeono.net/chapter-8-2.html
관련 자료를 보세요.
is를 숫자와 비교하지 말라고 설명하고 있는데, 그걸 비교하면 안 됩니다.
파이썬에서 모든 것은 객체입니다.
id는 객체의 고유번호를 구할 때 사용합니다.
a 객체와 리터럴 4가 같은 고유번호일 수도 있고, 아닐 수도 있죠.
이건 파이썬 내부에서 관리하는 부분입니다.
변수 a의 값이 4인지 알고 싶다면 a == 4를 써야 합니다. a is 4는 쓰지 말라는 겁니다. 동일성은 보장하지 않습니다.
중급자를 위한 파이썬 내부 구조를 알고 싶다면 <한권으로 개발자가 원하던 파이썬 심화 A to Z> 같은 책을 봐야 합니다.
http://www.yes24.com/Product/Goods/84183174?scode=032&OzSrank=2
실무에서 a is 4 같은 코드를 쓰면 안 됩니다. id 값이 같다는 보장은 없으니까요.
파이썬 구현체에 따라서 정수 값의 범위가 -5~256 사이일 때 우연의 일치로 is로 비교했을 때 True가 나오는 것일 뿐입니다.
>>> [1, 2, 3] == [1, 2, 3]
True
>>> [1, 2, 3] is [1, 2, 3]
False
is는 정체성을 비교할 뿐입니다. 우연의 일치가 아니라 큰 수로 넣으면 확실하게 차이를 알 수 있습니다.>>> a = 234567
>>> a == 234567
True
>>> a is 234567
False
>>>
잘못된 코딩을 하지 말라는 주의사항이고, 지속적으로 잘못된 코딩과 우연의 일치에 이유가 있을 것이라고 생각하면 곤란합니다.
if에서는 ==을 쓰고, =을 쓰지 말라고 해도 =을 써도 코드는 실행되는데요? 라고 하는 것과 비슷합니다.