is 和 == 的区别
前言:is,== 都是用来比较两个对象是否相等的运算符,可是它们依据什么来判断是True 还是 False呢?
一、==
a = [1, 2, 3]
b = [1, 2, 3, 4]
print(id(a), id(b)) # 5005896 , 5005960
print(a == b) # False
c = a.copy() # [1, 2, 3] [1, 2, 3]
print(a, c)
print(id(a), id(c)) # 5005896 , 34872584
print(a == c) # True
代码分析:a变量和b变量的内容、地址均不一样,结果返回为False,而a变量和c变量的内容一样,地址不一样,结果返回为True。所以,可以初步判断 ==在python中是用来比较内容是否相同的。
二、is
a = [1, 2, 3]
b = [1, 2, 3, 4]
print(id(a), id(b)) # 5005896 , 5005960
print(a is b) # False
c = a.copy() # [1, 2, 3] [1, 2, 3]
print(a, c)
print(id(a), id(c)) # 5005896 , 34872584
print(a is c) # False
代码分析:当地址、内容均不相同的变量a和变量b 进行 is 比较时,结果是False,而当地址不同、内容相同的变量a和变量c进行 is 比较时,结果也是False,所以可以得出 is 在python中用来比较地址是否相同的。
三、为什么呢?
class A:
def __init__(self, name):
self.name = name
a1 = A('aa')
a2 = A('aa')
print(a1 == a2) # False
print(a1 is a2) # False
class A:
def __init__(self, name):
self.name = name
def __eq__(self, other):
if self.name == other.name:
return True
return False
a1 = A('aa')
a2 = A('aa')
print(a1 == a2) # True
print(a1 is a2) # False
为什么在自定义类的对象中,内容即使一样,= = 比较返回结果也是False呢?
这是因为魔法方法__eq__ 定义了类的等号= =行为,而__eq__魔法方法是默认比较地址的, 在== 进行比较的时候,会自动去调用__eq__这个魔法方法,对于系统内置的数据对象(如:int float str list tuple 等)来说,底层已经自己把__eq__魔法方法重写好,是进行对象内容的比较,这一点不需要我们操心。而对于我们自定义对象(如自定义类的对象)如果我们想用它来比较对象内容的话,则需要我们自己去重写__eq__这个魔法方法。
对于is 来说,没有调用的内置函数,所以 is 就是用来比较地址是否一样的。