是运算符和 == 运算符 [重复]
Posted
技术标签:
【中文标题】是运算符和 == 运算符 [重复]【英文标题】:is operator and == operator [duplicate] 【发布时间】:2020-01-25 19:18:56 【问题描述】:num1
和 num2
都是 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
num1
和num2
都是 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中的空值合并运算符[重复]