# 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/

```