Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > len(var) is [CONSTANT] equal to len(var) == [CONSTANT]?

Reply
Thread Tools

len(var) is [CONSTANT] equal to len(var) == [CONSTANT]?

 
 
Tor Erik Soenvisen
Guest
Posts: n/a
 
      11-23-2006
Hi,


(len(['']) is 1) == (len(['']) == 1) => True

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... But this is a relatively
small range, and sooner or later you probably get two numbers with the same
id... Thoughts anyone?

Regards Tor Erik

PS: For those of you who don't know: keyword is compares object identities
 
Reply With Quote
 
 
 
 
Fredrik Lundh
Guest
Posts: n/a
 
      11-23-2006
Tor Erik Soenvisen wrote:

> (len(['']) is 1) == (len(['']) == 1) => True
>
> Is this the case for all numbers?


I'm not sure what you're asking here, but if you digest the following
facts, maybe you can answer it yourself:

1) all objects that exist at the same time have distinct identifies, and
2) a Python implementation may or may not hand reuse existing immutable
objects that have the same value when asked to create a new object,
3) identities are recycled when objects are deleted, and
4) [] and {} always create a new object every time they're evaluated.

</F>

 
Reply With Quote
 
 
 
 
Fredrik Lundh
Guest
Posts: n/a
 
      11-23-2006
> distinct identifies

don't trust your spellchucker.

</F>

 
Reply With Quote
 
Peter Otten
Guest
Posts: n/a
 
      11-23-2006
Tor Erik Soenvisen wrote:

> (len(['']) is 1) == (len(['']) == 1) => True
>
> 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,
> (i))


Shouldn't the test in the loop be

if i == j:
assert i is j


Of course it would fail...

Peter
 
Reply With Quote
 
Richard Brodie
Guest
Posts: n/a
 
      11-23-2006

"Tor Erik Soenvisen" <(E-Mail Removed)> wrote in message
news:Xns9884782092A96toreriknpolarno@129.242.5.222 ...

> which executes fine. Hence, 0-9999 is okey... But this is a relatively
> small range, and sooner or later you probably get two numbers with the same
> id... Thoughts anyone?


I think you are confusing yourself unnecessarily. The obvious way to implement
unique ids is to return the address of the object. It's very unlikely that two
different objects share the same address.


 
Reply With Quote
 
Steven D'Aprano
Guest
Posts: n/a
 
      11-23-2006
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



--
Steven.

 
Reply With Quote
 
Tor Erik Soenvisen
Guest
Posts: n/a
 
      11-23-2006
Steven D'Aprano <(E-Mail Removed)> wrote in
news(E-Mail Removed) bersource.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.
 
Reply With Quote
 
Duncan Booth
Guest
Posts: n/a
 
      11-23-2006
Steven D'Aprano wrote:

> 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.
>

I think it is worth pointing out that this is an area where people get
confused quite often; it is very easily to get misleading results when you
call the id() function. e.g.

>>> class C:

def f(self): pass
def g(self): pass


>>> c = C()
>>> id(c.f)==id(c.g)

True
>>> c.f is c.g

False

The ids are the same here only because the objects do not exist at the same
time. In the first comparison c.f is an expression which creates a
temporary object that is destroyed before the expression involving c.g is
evaluated, so it is possible for the different objects to have the same id.
In the second comparison the objects exist at the same time so they are
forced to have different ids.
 
Reply With Quote
 
Duncan Booth
Guest
Posts: n/a
 
      11-23-2006
Tor Erik Soenvisen <(E-Mail Removed)> wrote:

> I've seen code like this:
>
> if type([]) is list:
> print 'Is list'
>
> which seem to work.


'seem to work' is correct. Occasionally 'type(x) is list' is exactly what
is needed, but much more likely it is a potential bug.

It is more likely that what was intended was: isinstance(x, list)

It is even more likely that the intention was that the object should have
some list-like behaviour, in which case not doing a test at all is the
correct behaviour; or quite often that the object should be list-like but
not a string in which case testing the type against basestring would be
correct. e.g.:

if isinstance(x, basestring):
x = [x]
# ... now just assume x is a suitable sequence ...
for element in x:
...
 
Reply With Quote
 
Fredrik Lundh
Guest
Posts: n/a
 
      11-23-2006
Tor Erik Soenvisen wrote:

> 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.


None is guaranteed to be a singleton:

http://effbot.org/pyref/type-none.htm

Why "is" works for type objects should be pretty obvious, of course.

</F>



 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Internet Sharing: Equal upload speeds but un-equal download speeds =?Utf-8?B?TkpU?= Wireless Networking 3 09-15-2007 06:22 AM
driver irql not less or equal =?Utf-8?B?Y2VudHVyaWFu?= Wireless Networking 2 03-11-2005 08:30 PM
Load sharing between links where AS path length is equal Andrew Gideon Cisco 5 03-01-2005 11:55 PM
How to allocate an equal share of incoming web traffic to every user Anton Panyushkin Cisco 4 11-23-2004 02:41 PM
Re: OSPF Equal cost balancing in serie 2500 routers Aaron Woody Cisco 0 10-20-2003 02:42 PM



Advertisments