原因
今天与朋友谈到了python中的is,=,==,出现了一些争论,争论点是为两个变量赋予相同的数值,那么这两个变量的id一定不相同吗?
先要了解的
Python是一门弱变量类型语言,变量使用之前无需声明变量类型。对于一个变量,有三个属性:id(内存地址),type(变量类型),value(值),对于=,==,is:
- =赋值操作,传递的是id,type,value
- ==判断value是否相等
- is判断id是否相等
=赋值相对比较容易理解,我就不再赘述,只谈is 和 ==
小整数对象池
在python中,为避免小数值整数和短长度字符串频繁申请和销毁内存空间,使用了小整数对象池。Python shell 中, 对小数值整数的定义是 [-5, 256],小整数字符串是只包含字母、数字、下划线的字符串, 这些整数对象是提前建立好的,不会被垃圾回收,新建一个相同的值,永远对应同一个内存地址。
所以,在python shell里面,如果 a ,b 数值相同,而且又都在小整数对象池内,那么a ==b,a is b的答案都是True;
如果 a ,b 数值相同,但是不在小整数对象池内,那么a ==b的答案是True,a is b是False:
>>> a= "111111111111111111111111111111111111" #只包含整数的字符串
>>> b= "111111111111111111111111111111111111"
>>> a == b
True
>>> a is b
True
>>> a = -5 # [-5,256]的整数
>>> b = -5
>>> a is b
True
>>> a=-88 #[-5,256]以外的整数
>>> b = -88
>>> a is b
False
>>> a = "aaaaaaaaaaaa aaa" # 不是只包含字母、数字、下划线的字符串
>>> b = "aaaaaaaaaaaa aaa"
>>> a is b
False
大整数对象池
在pycharm中,没有python shell的那么多限制,只要是整数(不限大小)或者字符串(只要是字符串)的值相等,那么这两个值的value,id,type就全部相同。