object() == object()保证是False吗?

5
假设我创建两个类object的实例。这两个实例是否保证彼此不相等?换句话说,object() == object()是否保证为False,还是依赖于具体实现?
我理解object() is object()保证为False,但我在这里问的是object() == object()

3
它会对任何业务逻辑/架构设计产生影响吗? - Lei Yang
4
我想你可能需要阅读https://docs.python.org/3/reference/datamodel.html#object.__eq__。 - j1-lee
1
object() is object() 在哪里保证为 False - Kelly Bundy
1
@KellyBundy object() 的文档说明: "返回一个新的无特征对象。" - Flux
@Flux 对,但 is 用于测试对象的身份,这是使用 id() 函数确定的,而且 id(object()) == id(object()) 可以为 True,那么为什么不是 object() is object() 呢?我认为这比简单查找 object.__eq__ 做什么更难解释 :-P - Kelly Bundy
显示剩余7条评论
2个回答

10

是的,object() == object()保证是False,因为根据文档记载,"默认情况下,object使用is实现__eq__()"。


现在我们只需要证明is在那里保证是False - Kelly Bundy
@KellyBundy 我会说不:对于不可变类型,计算新值的操作实际上可能返回到具有相同类型和值的任何现有对象的引用,而对于可变对象则不允许这样做。然后,“在c = []; d = []之后,cd保证引用两个不同的、独特的、新创建的空列表。”如此多的形容词,却没有提到id运算符。显然,语义允许is比较返回True,但你必须证明为什么。如果那些object被猴子补丁到任何东西,如果is在那里返回True,那是毫无意义的。 - Nearoo
@Nearoo 嗯,我不认为这里有人在谈论猴子补丁或其他类似的事情。想象一下一个什么都不做的脚本,只是 print(object() == object()) 或者只是 print(object() is object()) - Kelly Bundy
@KellyBundy 但是如果你在那里返回True,你必须考虑其他情况。如果对象在比较之后被monkey patched怎么办?如果你为object() == object()返回true,你也应该为monkey patch的情况返回True,否则你必须设置规则,这将对程序员和编译器都很繁琐和难以决定。 - Nearoo
@Nearoo 嗯,你有点让我摸不着头脑,我不明白你在说什么。但是,“比较之后被猴子补丁修改”听起来像是你在谈论它们是两个分开的对象并且继续存在,因此你可能已经决定不使用is比较而返回true了。 - Kelly Bundy

3
每个Python 3.x版本都旨在与先前的3.x版本向后兼容。由于它是基类,更改object的比较行为将违反此向后兼容性承诺。因此,我认为你可以依靠它,但如果我们知道您要执行需要此不变式的操作,那么我们可能会给出更好的建议。 您始终可以使用assert来确保它仍然为真。

如果我们知道你需要这个不变量来做什么,我们可能可以给出更好的建议。谢谢您的回复。我并没有特别想要做什么。我只是出于好奇而问。 - Flux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接