【问题标题】:Comparing strings using '==' and 'is' [duplicate]使用'=='和'is'比较字符串[重复]
【发布时间】:2011-03-25 03:43:44
【问题描述】:

可能的重复:
Types for which “is” keyword may be equivalent to equality operator in Python
Python “is” operator behaves unexpectedly with integers

嗨。

我有一个问题可能比我所问的更能启发我。

考虑一下:

>>> x = 'Hello'
>>> y = 'Hello'
>>> x == y
True
>>> x is y
True

我一直使用比较运算符。我还读到is 比较内存地址,因此在这种情况下,返回True

所以我的问题是,这是在 Python 中比较变量的另一种方法吗?如果是,那么为什么不使用它?

我还注意到,在 C++ 中,如果变量具有相同的值,则它们的内存地址是不同的。

{ int x = 40; int y = 40; cout << &x, &y; }
0xbfe89638, 0xbfe89634

Python 内存地址相同的原因是什么?

【问题讨论】:

    标签: python


    【解决方案1】:

    这是一个实现细节,绝对不能依赖。 is 比较身份,而不是值。短字符串是内部的,因此它们映射到相同的内存地址,但这并不意味着您应该将它们与is 进行比较。坚持==

    【讨论】:

    • 啊,我明白了。我会坚持==,但我想确保我所做的事情是正确的。
    • 是否保留短字符串取决于您使用的解释器实现 - 您永远不能依赖它。
    【解决方案2】:

    在 Python 中有两种检查相等性的方法:==is== 将检查值,而 is 将检查身份。几乎在所有情况下,如果is 为真,那么== 一定为真。

    有时,Python(特别是 CPython)会一起优化值,使它们具有相同的标识。对于短字符串尤其如此。 Python 意识到 'Hello' 与 'Hello' 相同,并且由于字符串是不可变的,因此它们通过字符串实习/字符串池变得相同。

    查看相关问题:Python: Why does ("hello" is "hello") evaluate as True?

    【讨论】:

      【解决方案3】:

      这是因为一个名为 String interning 的 Python 功能,它是一种只存储每个不同字符串值的一个副本的方法。

      【讨论】:

      • +1 用于回答问题,而不是 - 出于习惯,我猜 - 说“不要”:)
      • 我在找这个词。谢谢,我会读的。这回答了我的要求。
      • 你已经回答了最后一个问题,但没有回答前两个问题。
      【解决方案4】:

      在 Python 中,字符串和整数都是不可变的,因此您可以缓存它们。 '-5' 到 '256' 范围内的整数和小字符串(不知道 atm 的确切大小)会被缓存,因此它们是同一个对象。 xy 只是引用这些对象的名称。

      同样== 比较等于值,而is 比较对象标识。 None TrueFalse 是全局对象,例如您可以将 False 重新绑定到 True

      以下显示并非所有内容都被缓存:

      x = 'Test' * 2000
      y = 'Test' * 2000
      
      >>> x == y
      True
      >>> x is y
      False
      
      >>> x = 10000000000000
      >>> y = 10000000000000
      >>> x == y
      True
      >>> x is y
      False
      

      【讨论】:

        【解决方案5】:

        在 Python 中,变量只是指向某个对象的名称(它们可以指向同一个对象)。在 C++ 中,变量还定义了为它们保留的实际内存;这就是为什么它们有不同的内存地址。

        关于 Python 字符串实习和两个比较运算符之间的区别,请参阅carl's response

        【讨论】:

        • 是的,我现在明白了。谢谢。
        猜你喜欢
        • 2011-02-28
        • 2011-09-28
        • 2017-09-18
        • 1970-01-01
        • 1970-01-01
        • 2013-04-15
        • 2018-07-09
        • 2017-06-27
        相关资源
        最近更新 更多