a_list = ['foo', 'bar']
创建一个新的 list
并将名称指向 a_list
之前指向 a_list
什么并不重要
a_list[:] = ['foo', 'bar']
以切片 __setitem__
索引, a_list
以内存中创建的新切片作为值 slice
的 list
__setitem__
__setitem__
评估 slice
以确定它代表什么索引,并调用 iter
传递的值。然后它迭代对象,将 指定范围内的每个索引设置为 slice
对象的下一个值。对于 list
s,如果 指定的范围 slice
与可迭代对象的长度不同,则 list
调整 的大小。这允许您执行许多有趣的操作,例如删除列表的部分:
a_list[:] = [] # deletes all the items in the list, equivalent to 'del a_list[:]'
或者在列表中间插入新值:
a_list[1:1] = [1, 2, 3] # inserts the new values at index 1 in the list
但是,对于 \'扩展切片\',其中 step
不是一,所以可迭代对象必须具有正确的长度:
>>> lst = [1, 2, 3]
>>> lst[::2] = []
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
ValueError: attempt to assign sequence of size 0 to extended slice of size 2
切片分配的主要不同之处 a_list
在于:
-
a_list
必须已经指向一个对象
-
该对象被修改,而不是指向
a_list
一个新对象
-
该对象必须
__setitem__
支持 slice
索引
-
右边的对象必须支持迭代
-
右侧的对象没有指向任何名称。如果没有其他引用它(例如,当它是文字时,如您的示例中所示),则在迭代完成后,它将被引用计数为不存在。