python is和==

Python 采取了正确的方式。运算符比较对象的值,而 is 比较引用。此外,Python 支持重载运算符, 能正确处理标准库中的所有对象,包括 None——这是一个正常的对象。

当然,你可以在自己的类中定义 __eq__ 方法,决定 == 如何比较实例。如果不覆盖 __eq__ 方法,那么从 object 继承的方法比较对象的 ID,因此这种后备机制认为用户 定义的类的各个实例是不同的。

如果所有 Python 对象都是不可变的。处理不可变的对象时,变量保存的是真正的对象还是共享对象的引用无关紧要,如果 a == b 成立,而 且两个对象都不会变,那么它们就可能是相同的对象。这就是为什么字符串可以安全使用驻留。仅当对象可变时,对象标识才重要。

在“纯”函数式编程中,所有数据都是不可变的,如果为集合追加元素,那么其实会 创建新的集合。然而,Python 不是函数式语言,更别提纯不纯了。在 Python 中,用户 定义的类,其实例默认可变(多数面向对象语言都是如此)。自己创建对象时,如果需 要不可变的对象,一定要格外小心。此时,对象的每个属性都必须是不可变的,否则 会出现类似元组那种行为:元组本身不可变,但是如果里面保存着可变对象,那么元 组的值可能会变。

可变对象还是导致多线程编程难以处理的主要原因,因为某个线程改动对象后,如果 不正确地同步,那就会损坏数据。但是过度同步又会导致死锁。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值