是否有理由使用“是”?

时间:2011-04-02 20:31:31

标签: python syntax operators comparison-operators

而不是“==”?我知道“是”是什么,它正在比较变量的身份。但是你什么时候想做呢?它为我所做的一切都是造成问题的原因。使用它一段时间后(因为我觉得它使我的代码更具可读性),我不会对“是”宣战。

是否有人将它用于“==”不会做的事情?我不明白他们为什么不把'是'与'=='做同样的事情,就像他们制作'和'和'&&'一样如果有人想要指针,他们只需要说“id(x)== id(y)”,我们就不会有这种混淆。

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

编辑: 谢谢你的答案。我认为新人应该带走的是“总是使用'​​==',除非你知道你在做什么”!

2 个答案:

答案 0 :(得分:7)

是的,有一个原因。

如果要比较 object-identity (“同一对象”)而不是对象相等(“相同值”)。几乎在所有情况下== object-equality )都是正确的运算符。 (正如评论中指出的那样,我完全跳过的琐碎案例是x is None成语 - NoneNoneType的唯一居民。)

object-identity 的一个案例是 identity-cache / dictionary ,它是某些代理或“由内而外”情况下的常见模式。在这种情况下,我不希望“类似对象”的值回来,我想要“同一个对象”的值。

快乐的编码。


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

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

答案 1 :(得分:4)

两者存在巨大差异。 is测试对象身份==测试相等

考虑这个简单的例子:

print [] == []     # True
print [] is []     # False