Python中is和==的区别

Python中is和==的区别,第1张

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


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6813545.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-28
下一篇2023-03-28

发表评论

登录后才能评论

评论列表(0条)

    保存