当你做
lst = anything
您正在将 名称 指向
lst一个对象。它不会
lst以 任何方式
更改用于指向的旧对象,尽管如果没有其他指向该对象的引用,其引用计数将降至零,并且将被删除。
当你做
lst[:] = whatever
您正在遍历
whatever,创建中间元组,并将元组的每个项目分配给 现有
lst对象中的索引。这意味着,如果多个名称指向同一个对象,你会看到的变化反映在引用任何名字,就像您使用
append或
extend或任何其他就地操作。
差异的一个示例:
>>> lst = range(1, 4)>>> id(lst)74339392>>> lst = [1, 2, 3]>>> id(lst) # different; you pointed lst at a new object73087936>>> lst[:] = range(1, 4)>>> id(lst) # the same, you iterated over the list returned by range73087936>>> lst = xrange(1, 4)>>> lstxrange(1, 4) # not a list, an xrange object>>> id(lst) # and different73955976>>> lst = [1, 2, 3]>>> id(lst) # again different73105320>>> lst[:] = xrange(1, 4) # this gets read temporarily into a tuple>>> id(lst) # the same, because you iterated over the xrange73105320>>> lst # and still a list[1, 2, 3]
说到速度,切片分配速度较慢。有关其内存使用情况的更多信息,请参见[PythonSlice分配内存使用)情况。


![列表分配为[:] 列表分配为[:]](http://www.mshxw.com/aiimages/31/650496.png)
