'is'和'=='的区别

6

可能是重复问题:
"foo is None"和"foo == None"有什么区别?

这其实是一个很简单的问题。

"foo is None"和"foo == None"有什么区别呢?

if a.b is 'something':

并且

if a.b == 'something':

请原谅我的无知。

2
当你意识到一个问题很简单时,可以确信在SO上可能已经有了答案。 - Martijn Pieters
2个回答

5

第一种检查的是身份(即是否为同一个对象),第二种检查的是相等性

例子:

is 运算符进行的第一次操作基于内存中这些项目(例如字符串)所存储的位置,可能 或者 可能不 返回 True

a='this is a very long string'
b='this is a very long string'

a is b
False

经过检查,id() 函数显示它们存储在不同的位置。

id(a)
62751232

id(b)
62664432

第二个操作(==)将会给出True,因为这两个字符串是相等的。
a == b
True

另一个例子展示了is可以是TrueFalse(与第一个例子相比),但==按照我们的预期工作:

'3' is '3'
True

这意味着与上面例子中的两个较长字符串不同,这两个短字符串字面值被存储在同一内存位置。
'3' == '3'
True

不出所料,这是我们所预期的。

我相信is使用id()来确定是否引用了内存中相同的对象(有关详细信息,请参见下面的@SvenMarnach评论)。


我认为它使用id()函数来确定是否引用了内存中的相同对象。但实际上,is只是比较指针。在CPython实现中,id()函数返回指针作为整数,因此这将是等效的。 - Sven Marnach
@SvenMarnach 谢谢 Sven,我会更新我的回答并指向你的评论。 - Levon
我只在 if a.b is None 的情况下使用过 is。还有其他的例子可以使用它吗(例如,您会将其用于比较对象实例吗?) - Robert Johnstone
抱歉,我从重复的问题中找到了答案 :) - Robert Johnstone

3

a is b是当ab是同一个对象时为真。它们可以比较相等,但是可能是不同的对象,例如:

>>> a = [1, 2]
>>> b = [1, 2]
>>> c = b
>>> a is b
False
>>> a is c
False
>>> b is c
True
>>> a == b == c
True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接