Python中身份认证运算符有 is 和 is not 两个,用于判断运算符的左右对象是否相等。

对象相等判断的依据是内存地址是否相同,我们可以使用id()函数获取对象的内存地址。

那么对于a is b 可以理解为:a的地址是b吗?a is not b 可以理解为 a的地址不是b吗?于是得出结论如下:

  • is运算符:如果两个对象的内存地址一样,返回True,否则返回False
  • is not 运算符:如果两个对象的内存地址不一样,返回False,否则返回True。

看下面的例子

#!/usr/bin/python
# coding=utf-8
a=2
b=3
c=a
print(id(a))
print(id(b))
print(id(c))
print(a is b)  # 返回False,a和b的内存地址不一样
print(a is c)  # 返回True,因为a和c的内存地址一样
print(a is not c) # 返回False,因为a就是c的地址
输出:
139665453922240
139665453922272
139665453922240
False
True
False

 从结果可知,a和c两个对像的内存地址一样,is运算符返回True,is not 返回False。

Python is和等号==的区别

它们的区别是:Python中等号==比较的两个对象的数值,而is比较的是两个对象的地址。看下面的例子:

#!/usr/bin/python
# coding=utf-8
a = ('y','x','j','c')
b = ('y','x','j','c')
print(a == b)
print(id(a), id(b))
print(a is b) 

输出:

True
140661990780024 140661990780344
False

从结果看出,虽然元祖a和b的数据是一样的,但是元祖是可变对象所以内存地址不同,因此is返回False,等号==返回True。

对于其它的可变对象都是成立的,这里不再复述。