运算符 | 描述 | 实例 |
---|---|---|
is | is 是判断两个标识符是不是引用自一个对象 | 本质上是判断两个对象的内存地址是否相同 |
is not | is not 是判断两个标识符是不是引用自不同对象 | 与is功能相反,本质上仍然是对两个对象的内存地址是否相等进行判断 |
先来几个示例,感受一下它的功能
a = 1
b = 1
print(a is b)
程序输出结果
True
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 是身份运算符,它比较的是两个对象的内存地址是否相同,如果内存地址相同,那么他们就是同一个对象。
上面的示例代码中,虽然列表的值相同,但他们是在两个不同的赋值语句中被创建的,因此他们的内存地址不同
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