引子
在python中比较两个对象是否相等时有两个处理方式:使用is关键字;使用符号==。但是有时候两种方式的结果是一样的,有时候两者的结果不一样,例如下面
字符串:
>>> a = "hello"
>>> b = "hello"
>>> a == b
True
>>> a is b
True
>>> c = "I am using a long string for testing"
>>> d = "I am using a long string for testing"
>>> c is d
False
>>> c == d
True
>>>
数值:
>>> e = 1
>>> f = 1
>>> e is f
True
>>> e == f
True
>>> g = 100000
>>> f = 100000
>>> g is f
False
>>> g == f
True
>>>
从结果来看很显然==符号的结果是我们想要的,但是is关键字有为什么 有时候与==表达式的结果一样,有时候不一样呢?
对比
先看下两者的区别:
-
is
,是python语言的关键字,主要是对比两个对象的内在地址是否一样,也即两个对象指向同一块地址。相当于调用id()
,不能被重载。 -
==
,是一种逻辑判断符号,主要是对比两个对象的内容是否一样。相当于调用__eq__()
,可以被重载。
从两者的区别可以知道,两者的结果不一样的原因根本就是判断的内容不一样
但是为什么有时候两者的结果又一样呢?
这个就是python语言的一个机制了,为了提高性能,对于较小的数字、较短的字符串会在内在中保留对应值的一个副本,当创建新的字符串、数值变量时直接指向该副本即可(否则就是每创建一个对象都会保存在一个单独的内存)。
例外
从引子中的例子看,应该是x is y
必定有x == y
。
理论上是对的,有一个例外情况,就是float类型的NaN,如下
>>> a = float('NaN')
>>> a is a
True
>>> a == a
False
>>>
网友评论