Can a simple a==b 'hang' in and endless loop?

Steve Holden steve at holdenweb.com
Wed Jan 18 08:52:33 EST 2006


Claudio Grondi wrote:
> Steve Holden wrote:
> 
>>Claudio Grondi wrote:
>>
>>
>>>In the process of learning about some deeper details of Python I am 
>>>curious if it is possible to write a 'prefix' code assigning to a and 
>>>b something special, so, that Python gets trapped in an endless loop 
>>>in a line with:
>>>
>>>if a==b: print 'OK'
>>>
>>>I mean, it would be of much help to me on my way to understanding 
>>>Python to know how such prefix code leading to an endless loop can 
>>>look like and if it is eventually not possible to write such code, to 
>>>know why it is not possible?
>>>
>>>My own first rough idea was to create generators which never end and 
>>>use them in the '==' comparison, but I have not well understood how to 
>>>write and use generators yet, so I expect from studying this special 
>>>case to come to some enlightenment.
>>>
>>
>>Well, you could try this:
>>
>> >>> class thing:
>> ...   def __eq__(self, other):
>> ...      return other == self
>> ...
>> >>> a = thing()
>> >>> b = thing()
>> >>> a == b
>>Traceback (most recent call last):
>>  File "<stdin>", line 1, in ?
>>  File "<stdin>", line 3, in __eq__
>>  File "<stdin>", line 3, in __eq__
>>  File "<stdin>", line 3, in __eq__
>>    ...
>>  File "<stdin>", line 3, in __eq__
>>  File "<stdin>", line 3, in __eq__
>>RuntimeError: maximum recursion depth exceeded
>> >>>
>>
>>Was that what you meant? Or something more like:
>>
>> >>> class thing:
>> ...   def __eq__(self, other):
>> ...     import time; time.sleep(1000000)
>> ...
>> >>> a = thing()
>> >>> b = thing()
>> >>> a == b
>>
>>regards
>> Steve
> 
> Thanks for the quick reply.
> 
> I see, that I have overseen, that as Fredrik also stated, one can 
> directly manipulate __eq__() as the easiest way to achieve what I 
> requested.
> 
> To explain why I am not happy with it, I will try here to give some more 
> background information. Sorry for not doing it directly, but as already 
> stated I have forgot about the possibility to use __eq__().
> 
> In Python the built in '==' operator (when not manipulated in own code) 
> behaves not as the '==' operator e.g. in C or Javascript, because it 
> iterates over arrays (i.e. lists) doing many comparisons instead of 
> comparing only two 'values'. Coming from C or Javascript one would 
> expect '==' to compare the 'pointers' to the arrays and not to iterate 
> over all elements of the lists.
> With the solution to the question above I intended to have an example of 
> Python code which outcome is an endless loop and the problem causing it 
> very hard to find if one thinks in terms of C or Javascript when 
> considering lists (as arrays) and the function of '==' operator.
> 
If your assertiona about C and Java are correct you would, of course, 
describing a deficiency of those languages, where a variable refers to a 
reserved area of storage intended to hold a value of a specific type (or 
a specific uinion of types).

To the Python user C and Java appear to be confusing "equality" with 
"identity". The == operator in C, certainly, compares identity (whether 
of values or of pointers to structured values). Frankly I don't choose 
to remember enough Java to determine the correctness of your assertion 
in that language.

In Python a name is intended to be bound as a reference to an object of 
any type whatsoever (the type pf the object is stored as a part of the 
value). Equality is generally defined as "has the same value", hence the 
ability to define it specifically for user-defined types.

In Python you test for "is the same object" with the "is" operator. As in

  >>> a = {1:2, 3:4}
  >>> b = {1:2, 3:4}
  >>> a == b
True
  >>> a is b
False
  >>>

regards
  Steve
-- 
Steve Holden       +44 150 684 7255  +1 800 494 3119
Holden Web LLC                     www.holdenweb.com
PyCon TX 2006                  www.python.org/pycon/




More information about the Python-list mailing list