有什么区别
list = range(100)
Run Code Online (Sandbox Code Playgroud)
和
list[:] = range(100)
Run Code Online (Sandbox Code Playgroud)
在Python?
编辑
我应该已经提到过,在分配列表变量已经分配给列表之前:
list = [1, 2, 3]
list = range(100)
Run Code Online (Sandbox Code Playgroud)
要么
list = [1, 2, 3]
list[:] = range(100)
Run Code Online (Sandbox Code Playgroud)
agf*_*agf 34
当你这样做
lst = anything
Run Code Online (Sandbox Code Playgroud)
您将名称 指向lst对象.它不会lst以任何方式更改用于指向的旧对象,但如果没有其他任何指向该对象的对象,则其引用计数将降为零并且将被删除.
当你这样做
lst[:] = whatever
Run Code Online (Sandbox Code Playgroud)
您正在迭代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]
Run Code Online (Sandbox Code Playgroud)
说到速度,切片分配速度较慢.有关其内存使用情况的更多信息,请参阅Python Slice Assignment内存使用情况.