身份运算符

运算符描述实例
is is 是判断两个标识符是不是引用自一个对象本质上是判断两个对象的内存地址是否相同
is notis not 是判断两个标识符是不是引用自不同对象与is功能相反,本质上仍然是对两个对象的内存地址是否相等进行判断

先来几个示例,感受一下它的功能

a = 1
b = 1
print(a is b)

程序输出结果

True

is 与 == 的区别

a = [1, 2, 3]  # 创建一个新的列表
b = [1, 2, 3]  # 创建一个新的列表

print(a == b)
print(a is b)
print(id(a), id(b))

程序输出结果

True
False
4367682696 4367682952

== 比较运算符,比较的是两个对象的值是否相等,从字面上看,这两个列表的值是完全相等的

is 是身份运算符,它比较的是两个对象的内存地址是否相同,如果内存地址相同,那么他们就是同一个对象。

上面的示例代码中,虽然列表的值相同,但他们是在两个不同的赋值语句中被创建的,因此他们的内存地址不同

同时对两个变量赋值1,为什么这两个1的内存地址相同

a = 1
b = 1
print(a is b)

程序输出结果

True

为什么这两个1的内存地址会相同呢?这里和python的内存管理有关,python设计者认为在[-5, 257)这个范围内的整数,是经常被使用的对象,因此,没有必要经常性的创建和释放他们,于是python建立了一个内存池,存储了这个范围内的整数,当你使用这个范围内的整数时,其实都是从这个内存池中取数,并没有重新创建

>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False

如果超出这个范围,尽管值相同,但是已经超出了内存池存储数据范围,因此分别在内存中创建了两个257,他们的内存地址不同

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案