python
is 比较的是地址
== 比较的是内容
通常来说 dict list tuple str set int str …有很多都是对象 声明的时候内容可以一样但是 地址不会一样
所以判断的时候 is都为false 而==则为True
对象缓冲池
自己目前了解int str 有
str
python有个intern机制,简单说就是维护一个字典,这个字典维护已经创建字符串(key)和它的字符串对象的地址(value),每次创建字符串对象都会和这个字典比较,没有就创建,重复了就用指针进行引用就可以了。intern机制处理字符串长度小于等于20且仅由数字字母下划线构成的,只创建一次。
在源文件中 str is操作符返回值为True
在 input 时候会为 两个内容相同的字符串 is操作符返回 false
重点来了 但是在input时候如果字符串为 [a-z , A-Z , 0-9, _ ,] 中的一个这些内容中的一个的时候 is会为 true
int类型
>>> i = -5
>>> j = -5
>>> i is j # i和j是同一个对象
True
>>> i = 256
>>> j = 256
>>> i is j # i和j是同一个对象
True
>>> i = 257
>>> j = 257
>>> i is j # i和j是不同对象
False
由上面的实例可以看到,当变量在[-5,256]之间时,两个值相同的变量事实上会引用到同一个小整数对象上,也就是小整数对象池 中的对象,而不会去创建两个对象。而当变量超出了这个范围,两个值相同的变量也会各自创建整数对象,所以两者对应的对象不同
小整数对象池和字符缓冲池都是作用于运行过程中,python缓存小的整数和字符,当有变量使用这些对象时,不用额外创建对象。