不覆盖比较运算符的Python对象是否等于自身?

Meh*_*Meh 13 python equality

class A(object):

    def __init__(self, value):
        self.value = value

x = A(1)
y = A(2)

q = [x, y]
q.remove(y)
Run Code Online (Sandbox Code Playgroud)

我想从列表中删除之前添加的特定对象,并且我仍然有一个引用.我不想要一个平等测试.我想要身份测试.这段代码似乎在CPython和IronPython中都有效,但语言是否能保证这种行为还是仅仅是侥幸?

list.remove方法的文档是这样的:same as del s[s.index(x)],这意味着一个相等,执行测试.

如果你不覆盖__cmp__,那么一个物体是否等于它自己,__eq__或者__ne__

wim*_*wim 11

是的.在您的示例中,q.remove(y)将删除第一次出现的比较等于的对象y.然而,类的方式A定义,你不应该曾经有一个变量比较平等的y-与也必将为同任何其他名称的例外y情况.

文档的相关部分在这里:

如果__cmp__(), __eq__() or __ne__()未定义任何操作,则通过对象标识("地址")比较类实例.

因此,A实例的比较是通过身份(在CPython中实现为内存地址).没有其他对象可以具有等于生命周期id(y)内的身份y,即只要你持有引用y(如果你要从列表中删除它,你必须这样做)

从技术上讲,仍然可以让其他存储位置的对象相等 - 这mock.ANY就是一个这样的例子.但是这些对象需要覆盖它们的比较运算符以强制结果.