列表赋值[:]

Max*_*Max 15 python list

有什么区别

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对象中的索引.这意味着,如果多个名称指向同一个对象,你会看到的变化反映在引用任何名字,就像您使用appendextend或任何其他就地操作.

差异的一个例子:

>>> 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内存使用情况.