有没有理由用“是”?

2024-05-23 18:03:30 发布

您现在位置:Python中文网/ 问答频道 /正文

而不是“==”?我知道“是”是什么,它是比较变量的同一性。但你什么时候想这么做?它给我带来的只是麻烦。在使用了一段时间后(因为我觉得它使我的代码更具可读性),我并没有对“is”宣战。在

有人用它来做“==”做不到的事情吗?我不明白为什么他们没有做“is”和“==”是同一件事,就像他们做了“and'same as”&;等等。如果有人想要指针,他们只需说“id(x)==id(y)”,我们就不会有这种困惑了。在

这是python中的“gotcha's”之一,我不明白,这会让很多新手绊倒。我认为它会让人们感到困惑的原因是他们不明白为什么它会进行身份比较。重点是什么?在

编辑: 谢谢你的回答。我认为新人应该记住的是“除非你知道自己在做什么,否则永远使用”=='!在


Tags: and代码id重点isas身份原因
2条回答

两者有很大的不同。is测试对象身份==测试是否相等。在

考虑这个简单的例子:

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

是的,这是有原因的。在

当您想比较对象标识(same object)和非对象相等性(object equality)(“相同值”)时。在几乎所有情况下,==对象相等)都是正确的运算符。(正如在评论中指出的,我完全忽略的一个小例子是x is None习语None是{}的唯一居民。)

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

快乐的编码。在


在Python中考虑指针是错误的。Python中的值是对象,每个值都表示自己。也就是说,x is y只有当xy求值为同一对象时,x is y才是真的。在python中传递对象时,同样的概念也会传递对象本身。不需要考虑参考文献。在

Python是Call-by-Sharing/Call-by-Object-Sharing,尽管存在于“官方文档场所”中的术语"Call-By-Reference"经常被错误地用于描述行为(也许是为了“简化”从其他语言的转换,在这些语言中该术语也经常被错误地使用)。在

相关问题 更多 >