使用'=='和'is'比较字符串
可能的重复问题:
在Python中,“is”关键字可能等同于等于运算符的类型
Python中的“is”运算符在处理整数时表现得有些意外
你好。
我有一个问题,可能会让我对这个话题有更深的理解。
考虑这个例子:
>>> 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 个回答
8
这是因为Python有一个叫做字符串驻留
的特性,它是一种只存储每个不同字符串值的一个副本的方法。
12
这是一个实现细节,绝对不能依赖它。is
是用来比较对象的身份,也就是它们在内存中的位置,而不是比较它们的值。短字符串会被存储在一个地方,所以它们会指向同一个内存地址,但这并不意味着你应该用 is
来比较它们。最好还是使用 ==
来比较。
10
在Python中,有两种方法可以检查两个东西是否相等:==
和 is
。==
是用来检查值是否相等,而 is
是用来检查它们是否是同一个东西。在几乎所有情况下,如果 is
返回真,那么 ==
也一定是真。
有时候,Python(特别是CPython)会把一些值优化到一起,这样它们就会有相同的身份。这种情况在短字符串中尤其常见。Python会意识到 'Hello' 和 'Hello' 是一样的,而且因为字符串是不可变的,它们通过字符串驻留/字符串池化变成了同一个东西。
可以查看一个相关的问题:Python: 为什么 ("hello" is "hello") 结果为真?