[EMAIL PROTECTED] writes: > On 28 dic, 20:12, Riccardo Murri <[EMAIL PROTECTED]> wrote: > >> The list `self.base` contains "canonical" forms of the graphs and the >> `graph` object must compare equal to some item of the list, which >> indeed it does:: >> >> (Pydb) p graph == self.base[27] >> True >> >> (Pydb) p graph in self.base >> True >> >> However, I cannot directly get the index of the canonical graph (the >> number "27" above was found by manual inspection):: >> >> (Pydb) self.base.index(graph) >> *** ValueError: list.index(x): x not in list >> >> All graphs are instances of a `Graph` new-style class that implements >> comparison operators `__eq__` and `__ne__`, but no other rich-compare >> stuff. >> >> I'm using Python 2.5:: >> >> Python 2.5 (release25-maint, Dec 9 2006, 16:17:58) >> [GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-20)] on linux2 >> >> So my question is: what are the implementation differences between `x >> in list` and `list.index(x)` and why can one report that an item is in >> the list while the other cannot find its index? Should I add >> something to the `Graph` class so that `index` works? > > (I've checked on 2.5.1 but I don't see any relevant differences with > the 2.5 version). Looking at the source for both methods, they only > use the __eq__ operator, but there is a slight difference: while one > evaluates list[i]==x, the other reverses the operands. If your __eq__ > is not reflexive, that could explain the difference. >
That was indeed the reason: a bug in Graph.__eq__ broke reflexivity in certain cases. Thank you very much!! -- Riccardo Murri, via Galeazzo Alessi 61, 00176 Roma -- http://mail.python.org/mailman/listinfo/python-list