id() and is operator
Gary Herron
gherron at digipen.edu
Mon Feb 23 01:29:50 EST 2015
On 02/22/2015 10:02 PM, Terry Reedy wrote:
> On 2/22/2015 4:25 PM, Marko Rauhamaa wrote:
>> LJ <luisjosenovoa at gmail.com>:
>>
>>>>>> id(b[0])
>>> 45855552
>> [...]
>>>>>> id(b[2])
>>> 45855552
>
>>> Please correct me if I am wrong, but according to this b[2] and b[0]
>>> are the same object. Now,
>>>
>>>>>> b[0] is b[2]
>>> False
>>
>> This is a true statement:
>>
>> If X is Y, then id(X) == id(Y).
>>
>> However, this is generally not a true statement:
>>
>> If X is Y, then id(X) is id(Y).
>
> If X and Y exist at the *same time*, then (X is Y) == (id(X) is
> id(Y)). Since X and Y in the example above do not exist at the same
> time, it is nonsensical to compare them.
Not quite. You've been bitten by the "is" versus "==" trap. You could use
id(X)==id(Y)
but not
id(X) is id(Y)
not even if X and Y are the same object. Simple examples:
>>> a=3
>>> id(a) is id(a)
False
>>> a=3
>>> b=a
>>> id(a) is id(b)
False
The explanation is that each call to id() makes its own independent
Python integer object containing the large integer (10771264 in this
case). The two integer objects satisfy "==", but they are separate
Python objects so they do not satisfy "is".
As a side note, It is an implementation detail whether two Python
integer objects created independently but with the same value are
separate objects or references to a single object. CPython caches
small integers so that only one integer object of each value exists, but
not so for large integers. You can experiment with the cutoff on your
particular flavor of Python. On mine (Python 3.4.2 (default, Oct 8
2014, 13:08:17) ;[GCC 4.9.1] on linux)
it's somewhere between 200 and 300:
>>> 201 is 1+200
True
>>> 301 is 1+300
False
Gary Herron
--
Dr. Gary Herron
Department of Computer Science
DigiPen Institute of Technology
(425) 895-4418
More information about the Python-list
mailing list