在python中"is"和"=="都可用来判断变量,刚开始学的时候很容易弄晕,一会儿is满足,一会儿不满足,搞不清该怎么用,所以这里做个小结。
is | 判断两个变量内存地址是否相同 |
== | 用来比较两个变量的值是否相等 |
首先我们先了解一下如何用全局函数id()查看内存地址
>>> num1 = 10000 #==判断的就是这个
>>> num2 = 20000 #==判断的就是这个
>>> id(num1)
830607078544 #is判断的就是这个
>>> id(num2)
830607077808 #is判断的就是这个
我们可以看见其内存地址和值两者都不一样,所以理所应当的is和==判断都为false
>>> num1 == num2
False
>>> num1 is num2
False
心急的小盆友就要说了,这不就是一个意思吗?别急,我们看下下面这种情况
>>> num1 = 10000
>>> num2 = 10000
>>> num1 is num2
False
>>> num1 == num2
True
没错,内存地址和值并不是一个概念,正常情况下,内存地址和值是分开,这也就is和==必须区分使用的原因。
>>> id(num1)
799191566992
>>> id(num2)
799191567184
接下来还有种情况,应该也是看这篇博客的朋友最关心的情况,为什么,我赋值一样时,它们的内存地址也是一样。
>>> num1 = 1
>>> num2 = 1
>>> id(num1)
799186381104
>>> id(num2)
799186381104
>>> num1 is num2
True
>>> num1 == num2
True
要讲清楚这点,就需要隆重介绍我们的缓存区概念了
我们知道在存储数据时是会耗费内存资源的,而一些经常反复用的数据,如果每次单独给它们分配空间的话,就会显得冗余,耗费内存资源也非常大,进而影响程序执行的效率,解决的方案能就是提前存储好一些常用数据,然后使用指针,把它们重复使用,例如在给一个变量赋值时假如赋给它的值是缓存区的数据,就不单独分配空间了,而是直接把缓存区里已经存好数据的内存地址给它,而存放着这些常用数据的区域就是缓存区了。
python缓存区中有一个数据区,数据区存的都是常量、固定不变的值、缓存数据等等,python中有一个小整型缓存区(-5~256),当变量的取值在这个小整型缓存区范围内,就不会再内存中开辟新的空间进行存储。
除了小整型缓存区还有字符串缓存区,但是不能包含特殊字符
>>> a = 10
>>> b = 10
>>> a == b
True
>>> a is b
>>> s = "hello"
>>> ss = "hello"
>>> s is ss
True
>>> s = "*hello"
>>> ss = "*hello"
>>> s == ss
True
>>> s is ss
False
>>>