a_list = ['foo', 'bar']
list在内存中创建一个新名称
a_list,并指向该名称。
a_list前面所指的是无关紧要的。
a_list[:] = ['foo', 'bar']
调用对象的
__setitem__方法,
a_list以a
slice作为索引,并
list在内存中创建一个新值作为值。
__setitem__评估
slice以确定它代表什么索引,并调用
iter它传递的值。然后,它会在对象上进行迭代,将所指定范围内的每个索引设置为该对象
slice的下一个值。对于
lists,如果由所指定的范围
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
但是,对于“ extended slices”,如果
step不能为1,则可迭代的长度必须正确:
>>> 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
指数 - 右边的对象必须支持迭代
- 没有名称指向右边的对象。如果没有其他引用(例如,如您的示例中的文字所示),则在迭代完成后,该引用将不存在。



