is和==

89 阅读1分钟
  • is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同
  • == 比较的是两个对象的内容是否相等,即内存地址可以不一样,内容一样就可以了(只看数值是否相同)。默认会调用对象的 __eq__()方法。

区别

  • is 与 == 相比有一个比较大的优势,就是计算速度快,因为它不能重载,不用进行特殊的函数调用,少了函数调用的开销而直接比较两个整数 id。而 a == b 则是等同于a.__eq__(b)。继承自 object 的 __eq__ 方法比较两个对象的id,结果与 is 一样。但是多数Python的对象会覆盖object的 __eq__方法,而定义内容的相关比较,所以比较的是对象属性的值,且'=='操作符则会递归地遍历对象的所有值,并逐一比较。

扩展

  • 在变量和单例值之间比较时,应该使用 is。目前,最常使用 is 的地方是判断对象是不是 None
  • 切片拷贝是浅拷贝
  • 小整数对象[-5,256]在全局解释器范围内被放入缓存供重复使用(所以当两个变量的值相等且为小整数时,内存地址相同)
  • 直接赋值都是赋值的引用