Python中关键字is和==有什么区别?

3

根据Python样式指南,应该使用Python关键字is来代替==运算符。

然而,它们并不总是完全相同,如下所示。为什么?实际上有何区别,正确的用法是什么?

import unittest

class testIS(unittest.TestCase):
    def test_is(self):
        self.assertEqual(1,1)

if __name__ == '__main__':
    unittest.main()

这个工作正常运行... 但是以下内容却不行...

import unittest

class testIS(unittest.TestCase):
    def test_is(self):
        self.assertEqual(1,1)

if __name__ is '__main__':
    unittest.main()

1
可能是重复的问题:Python中的字符串比较:is vs. == - Mat
6个回答

7

== 用于测试相等性,两个非相同的对象可以相等。

is 用于测试身份标识,即是否引用同一个对象。


更好的说法是 == 用于测试值,而 is 用于测试身份。 - orlp
1
@nightcracker:不,使用模棱两可的术语“相等”实际上是准确的,因为相等的定义是由对象的类型定义的。除非在用户定义的类中覆盖了__eq__,否则==检查的是标识而不是值。 - André Caron
@André Caron:默认实现是一个猜测,在Python中,身份恰好是一个相当好的猜测。但这绝不会改变它的语义含义,即按值测试相等性。 - orlp
1
@nightcracker,“value”是一个微妙的术语。例如,我可以定义类型对象的相等概率为0.5,而不考虑它们的值。或者我可以有一个临时对象“ignorecase(str)”,它除了与字符串比较相等之外什么也做不了。对于我来说,讨论这些对象的价值似乎毫无意义,但测试它们是否相等可能是有意义的。 - hamstergene
@nightcracker:这个类可以使__eq__与抽象相关的任何意义相符,包括按标识相等。这不一定是按值相等。 - André Caron

5

is会在两个变量指向同一个对象时返回True,==会在这两个变量所引用的对象相等时返回True。

>>> a = [1, 2, 3]
>>> b = a
>>> b is a 
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True

标记为最佳答案,因为提供了一个快速的例子 :) - jonathanbsyd

1
if money_in_wallet is money_that_was_in_wallet(two_weeks_ago):
    print("I still live with my parents and have no income or expenses")
elif money_in_wallet == money_that_was_in_wallet(two_weeks_ago):
    print("Good, my budget is exactly balanced")

0
Python关键字'is'检查对象的身份,而==运算符检查值的相等性。例如:
>>> if Car1 is Car2:
>>>     [do something...]

这段代码测试Car1和Car2是否引用同一辆车,而

>>> if Car1 == Car2:
>>>     [do something...]

检查Car1和Car2是否具有相同的质量,即它们是否具有相同的型号、颜色等。

因此,__name__"__main__"返回False,因为字符串"__main__"和存储在__name__中的值实际上是两个不同的字符串对象。因此,要检查__name__字符串的值是否等于__main__,请使用==运算符。


0

0

is 用于测试两个输入是否实际上是同一个对象,即位于内存中相同的地址。

== 调用其中一个输入对象的 __eq__ 方法。对象可以定义自己的 __eq__ 方法,并决定什么是相等的,什么不是。


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