"== 运算符" 和 "is 运算符"

3

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)


https://dev59.com/ZHVC5IYBdhLWcg3w-WOs - mattrea6
1
关闭得太快了 - 它并不是纯粹的重复,尽管它与之密切相关。我正在撰写有关Python中整数和浮点数差异的答案,这就是为什么我们在浮点值而不是整数中获得此行为的原因。 - Baldrickk
@Baldrickk 这仍然是一个重复问题——在CPython中,为什么它并不总是对整数起作用的原因已经在该重复问题的被接受答案中有所解释。 - bruno desthuilliers
3个回答

1
简单来说,is 用于检查对象的身份(identity),而 == 用于检查对象的相等性(equality)。 is 运算符比较两个对象的身份标识,而 == 运算符比较两个对象的值。

如果num1和num2都是3.5,为什么它们引用不同的地址? - Kaushik
1
@Kaushik,我认为你使用浮点数可能是原因。我尝试了相同的代码,使用整数,两个变量返回相同的ID。 - lmiguelvargasf
是的,我也尝试过,并且它对两个都产生了True。但是为什么我们使用浮点数时会得到False呢? - Kaushik
3
@Kaushik,CPython实现在某些不可变对象(尤其是小整数 - 对于“小”的定义已经从1.5.x时代以来发生了很大变化 - 和与Python标识符语法匹配的字面字符串)上使用内部缓存。这是一项实现细节。Python语言规范中没有规定必须或不必发生此缓存,它只规定is比较对象的id(而不是它们的“内存位置” - CPython使用内存地址作为id也是一项实现细节)。 - bruno desthuilliers

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


如果num1和num2都是3.5,为什么它们引用不同的地址? - Kaushik

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接