6.身份运算符
身份运算符,包括is 和 is not,用法是 value1 is value2 或者 value1 is not value2,返回bool值,作用是判断两个变量是否指向同一个对象。
比如这样:
>>> a = 10000
>>> b = 10000
>>> a is b
False
在这个示例中,我们分别创建了两个值为10000的int对象,并把它们分别赋给变量a和变量b,一般情况下,python每次新建一个对象,都会在内存中为它分配一个唯一的物理地址,所以如果不是用 b = a 这样的方式赋值的话,a和b不会指向同一个地址,那么is也不会返回true:
>>> a = 10000
>>> b = a
>>> a is b
True
我们在赋值运算符那篇解释过,当用b = a的方式给b赋值,实际上是让b和a指向了同一个对象,所以这种情况下,is 就会返回true。
刚刚我们说的是一般情况,但是也有特例,正常情况下,每次新建一个对象,都应该有不同的id,但是python为了节约内存,当新建的对象是短字符串或者在一定范围内的数值的时候,python会只创建一个对象,之后用户新建的对象,如果值和之前那个一样,那么python不会真的新建对象,而是会把变量的箭头指向旧的对象,这时候它们虽然从代码上看是分别创建的,实际上物理地址是一样的。
当我们创建的对象,是-5到256范围内的整数,或者是少于20个字符的字符串的时候,就会产生刚刚说的特例,我们可以手动测试一下这个阈值:
>>> a = -5
>>> b = -5
>>> a is b
True
>>> a = -6
>>> b = -6
>>> a is b
False
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False
字符串的示例这里就不写了,可以自己敲敲。
对象的物理地址可以用id函数来看,这个函数会返回一串数字,当然人类是看不懂这串数字的,计算机才能用这串数字找到对象,只是让我们直观地理解对象的物理地址是不是同一个:
>>> a = 10000
>>> b = 10000
>>> c = a
>>> id(a)
1757517270480
>>> id(b)
1757517054320
>>> id(c)
1757517270480
>>> a is c
True
>>> a is b
False
所以身份运算,也可以简单地理解为,对象的id的比较,当对象id一致时,is会返回true,否则返回false。
Tips:
特例的范围是我在查资料的时候找到的,有兴趣可以看看原文 :
-
笑豆豆 赞了这篇日记 2022-09-19 23:32:24