class A(object):
def __init__(self, value):
self.value = value
x = A(1)
y = A(2)
q = [x, y]
q.remove(y)
I want to remove from the list a specific object which was added before to it and to which I still have a reference. I do not want an equality test. I want an identity test. This code seems to work in both CPython and IronPython, but does the language guarantee this behavior or is it just a fluke?
The list.remove
method documentation is this: same as del s[s.index(x)]
, which implies that an equality test is performed.
So will an object be equal to itself if you don't override __cmp__
, __eq__
or __ne__
?
The == operator compares the value or equality of two objects, whereas the Python is operator checks whether two variables point to the same object in memory. In the vast majority of cases, this means you should use the equality operators == and !=
Put simply: == determines if the values of two objects are equal, while is determines if they are the exact same object.
The == operator helps us compare the equality of objects. The is operator helps us check whether different variables point towards a similar object in the memory. We use the == operator in Python when the values of both the operands are very much equal.
Yes. In your example q.remove(y)
would remove the first occurrence of an object which compares equal with y
. However, the way the class A
is defined, you shouldn't† ever have a variable compare equal with y
- with the exception of any other names which are also bound to the same y
instance.
The relevant section of the docs is here:
If no
__cmp__(), __eq__() or __ne__()
operation is defined, class instances are compared by object identity ("address").
So comparison for A
instances is by identity (implemented as memory address in CPython). No other object can have an identity equal to id(y)
within y
's lifetime, i.e. for as long as you hold a reference to y
(which you must, if you're going to remove it from a list!)
†Technically, it is still possible to have objects at other memory locations which are comparing equal - mock.ANY
is one such example. But these objects need to override their comparison operators to force the result.
In python, by default an object is always equal to itself (the only exception I can think of is float("nan")
. An object of a user-defined class will not be equal to any other object unless you define a comparison function.
See also http://docs.python.org/reference/expressions.html#notin
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With