2

而不是“==”?我知道“是”是什么,它正在比较变量的身份。但是你什么时候想要这样做?它对我所做的只是引起问题。在使用了一段时间后(因为我觉得它使我的代码更具可读性),我并没有对“is”宣战。

有人将它用于“==”不会做的事情吗?我不明白他们为什么不让'is'和'=='一样,就像他们让'and'和'&&'一样等等。如果有人想要指针,他们只需要说“id (x) == id(y)" 并且我们不会有这种混淆。

这是我不理解的python中的“陷阱”之一,并且绊倒了很多新手。我认为它绊倒人们的原因是他们不明白为什么它会进行身份比较。有什么意义(呃)?

编辑:感谢您的出色回答。我认为新人应该带走的是“除非你知道自己在做什么,否则总是使用'​​=='”!

4

2 回答 2

7

是的,这是有原因的。

当您要比较对象身份(“相同对象”)而不是对象相等性(“相同值”)时。在几乎所有情况下==object-equality)都是正确的操作符。(正如评论中所指出的,我完全跳过的小例子是x is None成语——None是唯一的居民NoneType。)

对象身份的一种情况是身份缓存/字典,这是某些代理或“由内向外”情况下的常见模式。在这种情况下,我不希望返回“相似对象”的值,我希望返回“相同对象”的值。

快乐编码。


在 Python 中考虑指针是错误的。Python 中的值是对象,每个值都代表它自己。也就是说,只有当和评估到同一个对象x is y时才为真。当在 python 中传递对象时,同样的概念也成立——传递对象本身。无需考虑参考。xy

Python 是Call-by-Sharing/Call-by-Object-Sharing虽然术语“Call-By-Reference” ——存在于“官方文档位置”中——经常被错误地用于描述行为(也许是“缓解“从其他经常错误使用该术语的语言的过渡)。

于 2011-04-02T20:40:31.597 回答
4

两者有很大的不同。is测试对象身份==测试平等

考虑这个简单的例子:

print [] == []     # True
print [] is []     # False
于 2011-04-02T20:42:19.110 回答