自从我开始学习python以来已经过了几天,此时我偶然发现了==
和is
。来自java背景,我假设==
按对象ID和is
按值进行比较,但是执行
>>> a = (1,2)
>>> b = (1,2)
>>> a is b
False
>>> a == b
True
似乎is
等同于java的==
,而python的==
等同于java的equals()
。这是考虑is
和==
之间区别的正确方法吗?或者有一个警告?
答案 0 :(得分:22)
另见
Why does comparing strings in Python using either '==' or 'is' sometimes produce a different result?
答案 1 :(得分:16)
is
检查两个操作数是否是同一个对象。 ==
在左操作数上调用__eq__()
,向右传递。通常这个方法实现了相等比较,但是可能编写一个将其用于其他目的的类(但它永远不应该)。
请注意,is
和==
会在某些实现上为某些对象(字符串文字,-1到256之间的整数)提供相同的结果,但这并不意味着运算符应该是在这些情况下被认为是可替代的。
答案 2 :(得分:1)
之间的区别和 == 最初也让我困惑,因为它们似乎对字符串都有相同的影响。对于任何可变对象(其中 对检测:别名很有用的东西之一),尝试与进行比较时,这种相似性会消失。复制可变对象是查看此内容的最简单方法。我将演示以及检测下面的别名的有用性:
>>> a=[1,2,3]
>>> b=a[:]
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> a==b
True
>>> a is b
False
>>> c=a
>>> a==c
True
>>> a is c
True
>>>
(直接取自我的IDLE外壳)
请注意, == 实质上是比较值,而是比较对象的标识(对象的内存位置,可以使用id(some_object)检索)。这可能有点令人困惑,但如果您了解数据在python中的存储方式,那么理解它就会变得容易一些。