使用'=='和'是'比较字符串

时间:2010-08-04 08:51:30

标签: python

  

可能重复:
  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具有相同内存地址的原因是什么?

5 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:10)

有两种方法可以检查Python中的相等性:==is==会检查值,而is会检查身份。几乎在所有情况下,如果is为真,则==必须为真。

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

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

答案 2 :(得分:8)

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

答案 3 :(得分:1)

在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

答案 4 :(得分:1)

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

关于Python字符串实习以及两个比较运算符之间的差异,请参阅carl's response