a_list = ['foo', 'bar']
在内存中创建一个新列表,并将其命名为a_list。这是什么a_list指出以前是无关紧要的。
a_list[:] = ['foo', 'bar']
使用slice作为索引调用a_list对象的__setitem__方法,并在内存中创建一个新列表作为值。
__setitem__评估切片以确定它所代表的索引,并对其传递的值调用iter。然后,它迭代对象,将切片指定的范围内的每个索引设置为对象的下一个值。对于列表,如果由slice指定的范围与iterable的长度不同,则会调整列表的大小。这样,您可以执行一些有趣的事情,例如列表的删除部分:
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
然而,对于“扩展片”,其中步骤不是一个,迭代必须是正确的长度:
>>> lst = [1, 2, 3]
>>> lst[::2] = []
Traceback (most recent call last):
File "", line 1, in
ValueError: attempt to assign sequence of size 0 to extended slice of size 2
切片分配到a_list的主要内容是:
> a_list必须已经指向一个对象>该对象被修改,而不是将a_list指向一个新对象>该对象必须支持具有切片索引的__setitem__>右边的对象必须支持迭代>没有任何名称指向右侧的对象。如果没有其他引用(例如当你的例子中是一个字面意思)时,在迭代完成之后它将被引用计数。