len(var) is [CONSTANT] equal to len(var) == [CONSTANT]?
Tor Erik Soenvisen
toreriks at hotmail.com
Thu Nov 23 06:35:43 EST 2006
Steven D'Aprano <steve at REMOVE.THIS.cybersource.com.au> wrote in
news:pan.2006.11.23.11.27.54.956445 at REMOVE.THIS.cybersource.com.au:
> On Thu, 23 Nov 2006 10:48:32 +0000, Tor Erik Soenvisen wrote:
>
>> Hi,
>>
>>
>> (len(['']) is 1) == (len(['']) == 1) => True
>
> You shouldn't rely on this behaviour:
>
>>>> x = 100000
>>>> len('a' * x) == x
> True
>>>> len('a' * x) is x
> False
>
> (Your results may vary -- this depends on the implementation.)
>
>
>
>> Is this the case for all numbers? I've tried running the following:
>>
>> for i in range(10000):
>> for j in range(10000):
>> if i != j:
>> assert id(i) != id(j), 'i=%d, j=%d, id=%d' % (i, j, id
>> (i))
>>
>> which executes fine. Hence, 0-9999 is okey...
>
> This doesn't necessarily hold for all integers -- again, it depends on
> the implementation, the precise version of Python, and other factors.
> Don't rely on "is" giving the same results as "==".
>
>>>> (1+2+3+4+5)**7 == 15**7
> True
>>>> (1+2+3+4+5)**7 is 15**7
> False
>
>> But this is a relatively
>> small range, and sooner or later you probably get two numbers with
>> the same id... Thoughts anyone?
>
> No, you will never get two objects existing at the same time with the
> same id. You will get two objects that exist at different times with
> the same id, since ids may be reused when the object is deleted.
>
>> PS: For those of you who don't know: keyword is compares object
>> identities
>
> Exactly. There is no guarantee that any specific integer object "1"
> must be the same object as another integer object "1". It may be, but
> it isn't guaranteed.
>
> I think the only object that is guaranteed to hold for is None. None
> is a singleton, so there is only ever one instance. Hence, you should
> test for None with "obj is None" rather than ==, because some custom
> classes may do silly things with __eq__:
>
> class Blank(object):
> """Compares equal to anything false, including None."""
> def __eq__(self, other):
> return not other
>
>
I've seen code like this:
if type([]) is list:
print 'Is list'
which seem to work. And also I've seen "var is None", as you mention.
More information about the Python-list
mailing list