Python 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 11:57:41) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> obj1 = ["a", "b", "c"]
>>> obj2 = obj1
>>> obj1 is obj2
True
>>> id(obj1)
2104722816712
>>> id(obj2)
2104722816712
>>> obj2 = obj1[:]
>>> obj2 is obj1
False
>>> id(obj1)
2104722816712
>>> id(obj2)
2104722796360
>>> obj1 == obj2
True
实现原理
is 比较的是两者是否是同一个对象,所以比较的是内存地址(id是否相同)。
== 是值比较。不可变对象,,例如 int,str,它会直接进行值比较。对于Python已知的对象,会调用他们的 eq 函数来比较。(其实已知的对象应该也是通过内置的 eq 函数来比较的)。对于自定义的对象,如果实现了 eq 函数,就会使用它比较,如果没有实现,效果和 == 是一样的。对象缓存机制
Python会对比较小的对象缓存,下次用到比较小的对象时,会去缓存区查找,如果找到,不会再开辟新的内存,而是继续把小对象的地址赋给新的值:
>>> obj1 = 1
>>> obj2 = 1
>>> obj1 is obj2
True
>>> obj1 = 257
>>> obj2 = 257
>>> obj1 is obj2
False
>>> obj1 =256
>>> obj2 =256
>>> obj1 is obj2
True
>>> obj2 = -5
>>> obj1 = -5
>>> obj1 is obj2
True
>>> obj2 = -6
>>> obj1 = -6
>>> obj1 is obj2
False
#-5至257之间使用相同的数字,指向的同一片内存空间