Python学习中经常会遇到 a == b 和 a is b 的问题, 也许你会为此迷惑。下面,我们来简单分析一下:
首先我们要了解对于Python对象而言,一般存在三个属性:type 类型, value 值 以及 地址id
- 1 a == b , 这是一个比较运算符,用于比较两个对象的value(值)是否相同
相同则返回True 否则返回False
示例:# 以下用于示例 a == b 用法 >>> a = 1 # a, b 数值类型 >>> b = 1 >>> a == b True >>> a = 'zhaoxuan' # a,b 字符串类型 >>> b = 'zhaoxuan' >>> a == b True >>> a = [1, 2] # a,b 列表类型 >>> b = [1, 2] >>> a == b True >>> a = 1 # a, b 数值类型 >>> b = 2 >>> a == b False >>> a = 'hello' # a,b 字符串类型 >>> b = 'world' >>> a == b False >>> a = [1, 2] # a,b 列表类型 >>> b = [1, 3] >>> a == b False
- 2 a is b , 这是一个同一性运算符。用于比较两个对象的物理id。如果相同则返回True
否则返回False
示例:# 以下用于示意 a is b 用法: >>> a = -5 # a, b 数值类型 >>> 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 # 下面讲解 >>> b = 'zhaoxuan' # a, b 字符串类型 >>> a = 'zhaoxuan' >>> a is b True # 简单字符串可用,下面讲解 >>> id(a) 42111997 >>> id(b) 42111997 >>> a = 'wo shi zhao xuan' >>> b = 'wo shi zhao xuan' >>> a is b False # 复杂字符串不可用,下面讲解 >>> id(a) 2146074255200 >>> id(b) 2146074255272 >>> a = (1,2,3) # a, b 元组类型 >>> b = (1,2,3) >>> a is b False >>> id(a) 2146074256320 >>> id(b) 2146074256378 >>> a = [1,2,3] #a,b list类型 >>> b = [1,2,3] >>> a is b False >>> a = {'a':1,'b':2} #a,b dict类型 >>> b = {'a':1,'b':2} >>> a is b False >>> a = set([1,2,3]) #a,b set类型 >>> b = set([1,2,3]) >>> a is b False >>> id(a) 2146074299258 >>> id(b) 2146074299236
-
综上:
- 1 数值相同时 a == b 返回True,否则返回False
- 2 数值相同时 a is b 未必返回True
-
总结:
- Python为了优化效率,内置了小整数对象池和简单字符串对象池。
小整数对象池包括[-5, 256]。这之间的小整数数值相同时在小整数对象池中属于同一对象
即是 a is b 返回True。简单字符串也是如此,对于其他对象则不适用
- Python为了优化效率,内置了小整数对象池和简单字符串对象池。
-