curiosity about the nature of identity (in python)
Bruno Desthuilliers
bdesth.quelquechose at free.quelquepart.fr
Wed Jun 28 21:40:31 EDT 2006
James Stroud a écrit :
> Hello all,
>
> What /is/ identity in python?
A unique identifier associated with each and every object in the
process. What exactly is this identifier is left to the implementation -
FWIW and IIRC, CPython uses the memory address of the C 'object'
datastructure.
> For example, we can always count on
>
> py> None is None
> True
Yes. None is a singleton.
> But I have noticed that this works for strings:
>
> py> "none" is "none"
> True
>
> and, for example, integers:
>
> py> 42 is 42
> True
This is an implementation detail of CPython - which does some caching,
and is by no way specified by the language. You should *never* rely on
this. FWIW, try:
a = 3900000
b = 3900000
a is b
> And I have noticed that this works for equivalent expressions:
>
> py> 42 is (40 + 2)
> True
>
> So, I'm guessing that the integer 42, or the string "none" is cached
> somewhere
Bingo !-)
> and python looks to see if it is in the cache when evaluating
> 'is'.
I don't think the evaluation of 'is' as anything to do with this.
> My guess is supported with this test:
>
> py> id(42)
> 149679044
> py> id(40+2)
> 149679044
> py> id(7*6)
> 149679044
Now what about this:
>>> id(600)
134745616
>>> id(601)
134745616
id of an object is unique *for the lifetime of this object*. Nothing
prevents it from being reused later.
> So, I guess my question is to what extent is this equivalency
> implementation dependent?
cf above
> Is this equivalency a requirement for a
> legitimate python implementation?
cf above
> Won't these checks slow down
> evaluation of 'is' considerably?
I really doubt that comparing memory addresses could be slow...
> Does '==' ever fall back and use 'is'
> (or 'id') for evaluation?
Seems so :
>>> class Foo(object): pass
...
>>> f1 = Foo()
>>> f2 = Foo()
>>> f3 = f1
>>> f1 == f2
False
>>> f1 == f3
True
More information about the Python-list
mailing list