可能重复:
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具有相同内存地址的原因是什么?
答案 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)会被缓存,因此它们是同一个对象。 x
和y
只是引用这些对象的名称。
同样==
比较等于值,而is
比较对象标识。 None
True
和False
是全局对象,例如,您可以将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。