而不是“==”?我知道“是”是什么,它正在比较变量的身份。但是你什么时候想做呢?它为我所做的一切都是造成问题的原因。使用它一段时间后(因为我觉得它使我的代码更具可读性),我不会对“是”宣战。
是否有人将它用于“==”不会做的事情?我不明白他们为什么不把'是'与'=='做同样的事情,就像他们制作'和'和'&&'一样如果有人想要指针,他们只需要说“id(x)== id(y)”,我们就不会有这种混淆。
这是我不理解的python中的“陷阱”之一,并且绊倒了很多新手。我认为它让人们吵架的原因是他们不明白为什么会进行身份比较。有什么意义(呃)?
编辑: 谢谢你的答案。我认为新人应该带走的是“总是使用'==',除非你知道你在做什么”!
答案 0 :(得分:7)
是的,有一个原因。
如果要比较 object-identity (“同一对象”)而不是对象相等(“相同值”)。几乎在所有情况下==
( object-equality )都是正确的运算符。 (正如评论中指出的那样,我完全跳过的琐碎案例是x is None
成语 - None
是NoneType
的唯一居民。)
object-identity 的一个案例是 identity-cache / dictionary ,它是某些代理或“由内而外”情况下的常见模式。在这种情况下,我不希望“类似对象”的值回来,我想要“同一个对象”的值。
快乐的编码。
考虑Python中的指针错误。 Python中的值是 objects ,每个值都代表自己。也就是说,x is y
仅在x
和y
评估同一对象时才为真。当在python中传递对象时,同样的概念成立 - 传递对象本身。无需考虑参考文献。
Python是Call-by-Sharing/Call-by-Object-Sharing,虽然术语"Call-By-Reference" - 存在于“官方文档中” - 经常被错误地用于描述行为(也许是为了“缓解”从其他语言的过渡这个词经常被错误地使用了。)
答案 1 :(得分:4)
两者存在巨大差异。 is
测试对象身份和==
测试相等。
考虑这个简单的例子:
print [] == [] # True
print [] is [] # False