列表分配为[:]
之间有什么区别
list = range(100)
和
list[:] = range(100)
在Python中?
编辑
我应该提到,在该分配列表变量已分配给列表之前:
list = [1, 2, 3]
list = range(100)
要么
list = [1, 2, 3]
list[:] = range(100)
-
当你做
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 object 73087936 >>> lst[:] = range(1, 4) >>> id(lst) # the same, you iterated over the list returned by range 73087936 >>> lst = xrange(1, 4) >>> lst xrange(1, 4) # not a list, an xrange object >>> id(lst) # and different 73955976 >>> lst = [1, 2, 3] >>> id(lst) # again different 73105320 >>> lst[:] = xrange(1, 4) # this gets read temporarily into a tuple >>> id(lst) # the same, because you iterated over the xrange 73105320 >>> lst # and still a list [1, 2, 3]
说到速度,切片分配速度较慢。有关其内存使用情况的更多信息,请参见[PythonSlice分配内存使用)情况。