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

Claudio Grondi claudio.grondi at freenet.de
Wed Jan 18 08:33:49 EST 2006


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.

Claudio



More information about the Python-list mailing list