是运算符和 == 运算符 [重复]

Posted

技术标签:

【中文标题】是运算符和 == 运算符 [重复]【英文标题】:is operator and == operator [duplicate] 【发布时间】:2020-01-25 19:18:56 【问题描述】:

num1num2 都是 3.5,num1 == num2 给出 True,但对于 is 运算符,它是 False

看下面的代码,

输入:

num1 = 3.5
num2 = float(input('num2:'))  # num2 stands for 2nd number
print(num1 == num2)
print(num1 is num2)

输出:

num2:3.5
True
False

num1num2 都是 3.5 和 num1 == num2 给出 True,但是 对于is 运算符,它是False

为什么是id(num1) != id(num2)

【问题讨论】:

***.com/questions/132988/… 关闭的太快了——虽然它密切相关,但它并不是一个纯粹的复制品。我写了一个关于python中整数和浮点数如何不同的答案的一半,这就是为什么我们用浮点值而不是整数来获得这种行为。 @Baldrickk 它仍然是重复的 - 它不总是对 int 在 CPython 中工作相同的原因在接受中进行了解释重复的答案。 【参考方案1】:

简单地说,is 将检查身份,而== 将检查是否相等。 is 运算符比较两个对象的标识,而== 运算符比较两个对象的值。

【讨论】:

如果num1和num2都是3.5,为什么引用不同的地址? @Kaushik,我认为您使用浮动的事实可能是原因。我用整数尝试了相同的代码,两个变量都返回相同的 id。 是的,即使我尝试过,它对两者都产生了 True。但是为什么当我们使用 float 时它是 False 呢? @Kaushik CPython 实现在一些不可变对象上使用内部缓存(特别是小整数 - 对于“小”的定义,自 1.5.x 天以来已经发生了很大变化 - 以及与 python 匹配的文字字符串标识符语法)。 这是一个实现细节。 Python 语言定义中没有任何内容要求这种缓存应该或不应该发生,它只是说明is 比较对象的 id(不是它们的“内存位置” - CPython 使用的事实作为 id 的内存地址也是一个实现细节)。【参考方案2】:

== 运算符比较两个操作数的值并检查值是否相等。而is 运算符检查两个操作数是否引用同一个对象。

【讨论】:

为什么 num1 和 num2 都是 3.5 时引用不同的地址?【参考方案3】:

就像其他两个所说的,== 检查相等性,是检查 id()。使用 id() 来查看对象 id 是什么,它们不会相同,这就是为什么 'is' 返回 false。

【讨论】:

以上是关于是运算符和 == 运算符 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

是啥 ?。运营商和我可以在哪里使用? JavaScript中的空值合并运算符[重复]

java中的递减和赋值运算符[重复]

如果条件在c ++和python中执行运算符[重复]

C和JAVA中增量-减量运算符的差异[重复]

字符串连接中 string.concat 和 + 运算符之间的区别[重复]

PHP和MySQL中何时使用'@'运算符[重复]