【问题标题】:is there ever a reason to use "is"?有没有理由使用“是”?
【发布时间】:2011-04-02 20:31:31
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python syntax operators comparison-operators


    【解决方案1】:

    是的,这是有原因的。

    当您想比较 object-identity(“相同的对象”)而不是 object-equality(“相同的值”)时。在几乎所有情况下,== (object-equality) 都是正确的运算符。 (正如 cmets 中所指出的,我完全跳过的小例子是 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" 存在于“官方文档位置”中 - 经常被错误地用于描述行为(也许是为了“缓解”从该术语所在的其他语言的转换也经常被错误地使用)。

    【讨论】:

    • 但是在 python 中你什么时候需要这样做?我想不出一个例子。由于一切都是指针,因此您永远不必担心这一点。
    • @Garret Berg 我记得唯一一次使用对象身份比较是用于对象缓存。我不希望返回“相似对象”的值,我希望返回“相同对象”的值。
    • @Garrett:身份测试通常比相等测试更快(这就是为什么a is Nonea == None 更好)。另外,Python 中没有指针。
    • 一切都是引用(不是指针),这正是您想要使用它的原因。一切都是引用,因此您不能只取消引用指针并直接检查对象身份。有时,您知道两个对象将具有相同的值,但您想确保它们实际上是对同一对象的引用。
    • 正如 pst 所说,主要用例是当您想要存储有关 特定 实例的附加信息时,实际上并不关心该实例的值。
    【解决方案2】:

    两者有很大的不同。 is 测试对象 identity== 测试 equality

    考虑这个简单的例子:

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

    【讨论】:

    • 是的,当然。并且觉得用一个简单的例子来说明两者之间的区别会很有帮助。
    • +1 我认为这是一个很好的例子。每个[] 创建一个新对象。很高兴看到它在x = [] 上扩展,并在x 上进行相同的测试。
    猜你喜欢
    • 2013-08-29
    • 2019-11-12
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多