总的来说,官方文档中说 is 表示的是对象标示符(object identity),而 == 表示的是相等(equality)。is 的作用是用来检查对象的标示符是否一致,也就是比较两个对象在内存中的地址是否一样,而 == 是用来检查两个对象是否相等。
- 检查 a is b 的时候,其实相当于检查 id(a) == id(b)。
- 检查 a == b 的时候,实际是调用了对象 a 的 __eq()__ 方法,a == b 相当于 a.__eq__(b)。
i1 = 205464113
i2 = 205464113
i3 = i1
print(id(i1))
print(id(i2))
print(id(i3))
print(i1 is i2)
print(i1 == i2)
print(i1 is i3)
print(i1 == i3)
print('**********')
f1 = 1.574
f2 = 1.574
f3 = f1
print(id(f1))
print(id(f2))
print(id(f3))
print(f1 is f2)
print(f1 == f2)
print(f1 is f3)
print(f1 == f3)
print('**********')
str1 = 'james'
str2 = 'james'
str3 = str1
print(id(str1))
print(id(str2))
print(id(str3))
print(str1 is str2)
print(str1 == str2)
print(str1 is str3)
print(str1 == str3)
print('**********')
t1 = (1, 2, 3)
t2 = (1, 2, 3)
t3 = t1
print(id(t1))
print(id(t2))
print(id(t3))
print(t1 is t2)
print(t1 == t2)
print(t1 is t3)
print(t1 == t3)
print('**********')
结果如下:
前面三个都很好理解,最后一个 id 由于 t1 和 t2 id 不同所以判断 is 的时候为 False,表示并不是指向同一对象,但是对象值是一样的,所以判断 == 的时候为 True。
再来一个例子就:
a = 2.0
b = 2
print(id(a))
print(id(b))
print(a is b)
print(a == b)
结果如下:
解释:显然 a 是一个浮点数类型,b 是一个整型,所以肯定不是指向同一对象,对应的对象标识符也不同,所以判断 is 为 False。但是由于数学上 2.0 = 2 所以判断 == 为 True。
可以认为:is 为 True,== 必为 True。因为指向同一对象,当然值是一样的。但是 == 为 True,is 不一定为 True,上例即为反例。