Python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。
s和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同.
官方文档中说 is 表示的是对象标示符(object identity),而 == 表示的是相等(equality)。is 的作用是用来检查对象的标示符是否一致,也就是比较两个对象在内存中的地址是否一样,而 == 是用来检查两个对象是否相等。
is
比较的是对象标识符,用来检查对象的标识符是否一致,即两个对象在内存中的地址是否一致。在使用a is b
的时候,相当于是做id(a)==id(b)
判断。==
比较两个对象的值是否相等,相当于调用__eq__()
方法,即a==b
等同于a.__eq__(b)
。
>>> x = y = [4,5,6] #这里x和y保存的地址相同,也就是id相同
>>> z = [4,5,6] #z和x,y仅仅是值相同,保存地址不同
>>> x == y #==只判断值是否相等
True
>>> x == z
True
>>> x is y #is判断是否是同一地址的相同值
True
>>> x is z
False
>>>
>>> print id(x)
3075326572
>>> print id(y)
3075326572
>>> print id(z)
3075328140
Python里和None比较时,为什么是 is None 而不是 == None 呢?
因为PEP8有以下规定
“Comparisons to singletons like None should always be done with ‘is’ or ‘is not’, never the equality operators.”
— From PEP8
如上所述None在Python里是个单例对象
,一个变量如果是None,它一定和None指向同一个内存地址。None是python中的一个特殊的常量,表示一个空的对象。空值是Python中的一个特殊值,数据为空并不代表是空对象
,例如[],'',(),{}
等都不是None。