Python之易混淆点一

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 就是用来比较地址是否一样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值