is 和 == 都是对 python 对象进行比较的操作符,python 对象包含三个要素:id,type,value。
== 运算符
- 主要对 python 对象的 value 进行比较,如比较字符串,数字等
>>> a = 'python'
>>> b = 'python'
>>> a == b
True
is 运算符
- 也称为同一性运算符,主要对 python 对象的 id 进行比较。
>>> a = [1,2,3]
>>> b = a # 相当于将变量 a 的 value 值的地址赋给变量 b,而不是变量 a 本身的地址
>>> c = [1,2,3]
>>> a is b
True
>>> a is c
False
>>> id(a), id(b), id(c)
(139847137782600, 139847137782600, 139847137803144)
以上例子中,a, b, c 三者的值相同,但关联对象的 id 这有前两个相同,变量 b 是通过赋值语句 = 创建的,= 的作用就是将变量关联的对象 id 传给新的变量,而不是变量本身的地址。
- 在不同的数据类型情况下,使用 is 比较也会产生不同的结果
>>> a = 1
>>> b = 1
>>> a is b
True
>>> c = .5.5
>>> d = 5.5
>>> c is d
False
由上面的代码可见,同样是数值类型,整数类型和浮点数类型比较的效果不同。
>>> a = 'abc'
>>> b = 'abc'`
>>> a is b
False
>>> a = 'a'
>>> b = 'a'
>>> a is b
True
字符串和单个字符比较的结果也会不同。
对于单个字符的 str 类型和数值较小的 int 类型变量,python 通过重用对象内存的方法来提高运行效率,但对于数值较大的int 类型和长字符串就会另外分配新的内存。
另外,当变量a, b(变量 b 不是使用 b = a 创建的)是tuple, list, dict或set类型时,即使 a == b 为 True,a is b 的返回值也一定是 False