
is是比较对象的id,而==仅比较对象的值,看下面的例子
似乎PYTHON在给不同的变量赋相同整数值小于等于256时,是用了同一个ID的。大于等于257的整数时,用的是不同的id,这时候就有区别了。
在许多语言中,使用 == 来判断两个值是否相等。有些语言中还有 is ,但是意义各不相同,本文着重于介绍各语言中这些概念。
Python 中的 == 来比较两个值是否相等。例如:
数值上的相等是显而易见的,那么对于对象呢?
先以 Python 自带的 list 对象为例:
Python 将会对 list 中的每个元素进行比较。对于类的实例,实际上是调用 __eq__() 方法来进行比较的。
Python 中的 is 则表示是否是同一对象:
对于简单的数字:
但是对于对象:
Python 中还有 isinstance() 函数和 type() 函数,用以确定对象的类别。
区别:
如果要判断两个类型是否相同推荐使用 isinstance()。
下面引用菜鸟教程的例子:
在上文的 Python 中, == 用来判断值是否相等, is 用来判断是否是同一个对象。而在 Java 中, == 同时拥有以上两种含义。
== 对于基本数据类型,是比较值;对于引用数据类型,是比较是否是同一对象,或者说是比较 堆内存地址 。
对于基本类型,自然可以直接 == 。(但是 Java 是区分 int 和 Integer,double 和 Double 等的,要注意!)
对于类的实例,则比较的是否是同一对象。
默认情况下,比较是否是同一对象,将上例中的 instanceA == instanceB 改为 instanceA.equals(instanceB) ,仍然输出 false 。
因此,我们需要重写(Override) equals() 方法,来实现自定义的比较:
不过上文这种重写并不优雅,工程中请勿这样使用。
Java 中使用 instanceof 来比较一个对象是否是一个类的实例。
DemoClass 类定义如前文,不赘述。
我们把 instanceA 的静态类型从 DemoClass 改为 Object ,众所周知, DemoClass 继承于 Object 。
但是这样输出的仍然是 true 。
首先是对于简单的数字,这种情况下,各语言的 == 都会是比较值的。
Kotlin 的双等于号相当于 Java 的 equals ,这在比较两个字符串是否内容相同时很方便。
在没有重写 equals 方法的情况:
似乎是 Kotlin 会自动生成一个 euqals 方法,所以这里的 instanceA == instanceB 为 true 。
重写了之后,就更加明了了。
Kotlin 中有三等号 === 来判断是否是同一对象。
这里可以看出, instanceA == instanceB 为 false ,因为二者并非同一对象。
Kotlin 中的 is 类似于 Python 中的 isinstance 、Java 中的 instanceof :
Python中的对象包含三要素:id、type、value其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值
is判断的是a对象是否就是b对象,是通过id来判断的
==判断的是a对象的值是否和b对象的值相等,是通过value来判断的
如下代码或许可以帮助你理解。
>>>a = 1
>>>b = 1.0
>>>a is b
False
>>>a == b
True
>>>id(a)
12777000
>>>id(b)
14986000
>>>a = 1
>>>b = 1
>>>a is b
True
>>>a == b
True
>>>id(a)
12777000
>>>id(b)
12777000
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)