Python中==和is的区别
1. python中变量的存储优化
小整数
为了优化存储空间,python为小整数([-5,255])分配固定的存储空间,当变量为小整数时,对象直接指向该小整数对应的地址。
id()
返回对象的唯一标识符,标识符是一个整数。Cython中id()
获取对象的内存地址。
举个栗子:
>>> a = 1
>>> b = 1
>>> id(a)
94735761692056
>>> id(b)
94735761692056
>>> c = [1,0,1]
>>> id(c[0])
94735761692056
>>> id(c[2])
94735761692056
>>> d = 10240
>>> e = 10240
>>> id(d)
94735762059952
>>> id(e)
94735762059904
可见,所有值为1的变量在内存中的标识都是一样的。
字符串驻留
Python 中的空字符串和 ASCII 字符都会使用到字符串驻留(string interning)技术。怎么理解?你就把这些字符(串)看作是单例的就行。也就是说,两个相同内容的字符串如果使用了驻留的技术,那么内存里面其实就只开辟了一个空间。
除此之外,字符长度不超过 20 的串也使用到了同样的技术。
继续举栗:
>>> a = 1
>>> b = 'abc'
>>> c = [1, 'abc']
>>> d = [1, 'abc']
>>>
>>> id(b)
140668511832944
>>> id(c[1])
140668511832944
>>> e = b * 7
>>> f = b * 7
>>> id(b)
140668511832944
>>> id(e)
140668511854704
>>> id(f)
140668511854768
2. is和==操作的意义
操作符 | 意义 | 说明 |
---|---|---|
is | object identity | 比较对象的标识符 id(obj) |
== | equal | 值是否相等 |
因此,a is b
基本相当于id(a)==id(b)
,而==
才是判断两个对象的值是否相等。
a == b
相当于a.__eq__(b)
,所以 ==
可以被重载,而is
不能被重载。
通常,a is b
为True时,a == b
也为True。特殊情况,如NaN
,Nan != NaN
。
>>> a = float('NaN')
>>> a is a
True
>>> a == a
False