简单来说:python在做切片的时候是通过申请一个新的内存去构造一个新的列表来存储切片得到的的值。
原理:Python原始数据结构中并没有列表的“视图”概念,因为列表自己的内存地址上存储的就是值的索引了。无论切片还是浅拷贝,都是开辟新的内存空间,将这些原列表切片段地址保存的索引复制到新的内存地址上,并将新的内存地址生成新的list对象返回给你
说明:
a[?:?]的形式进行切片,无论?具体为多少,它都会逐个访问这些值,并申请新的内存空间构造新的list对象来存储上述的值。所以,当你对切片后的对象取id是肯定不同的。
但是id(a[?])的形式却是返回a列表第?个索引指向的内存地址,即第?个值的真实存储地址。在此情况下,b = a[:],id(b[0]) 是等于 id(a[0])的。
例子:
>>> a = [1, 2, 3]
>>> b, c, d = a[0:], a[1:], a[2:]
>>> id(b), id(c), id(d)
(340416392L, 346237960L, 346471688L)
>>>
>>> b = a[:]
>>> id(a[0]), id(a[1]), id(a[2])
(55075864L, 55075840L, 55075816L)
>>> id(b[0]), id(b[1]), id(b[2])
(55075864L, 55075840L, 55075816L)
附:至于题主的倒数第二个案例为啥他们id会一样的原因,我觉得有可能是bug…