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就是一个这样的例子.但是这些对象需要覆盖它们的比较运算符以强制结果.