我在很多地方看到 list
使用切片分配。当与(非默认)索引一起使用时,我能够理解它的用途,但我无法理解它的用途,例如:
a_list[:] = ['foo', 'bar']
这和它有什么不同
a_list = ['foo', 'bar']
?
最佳答案
a_list = ['foo', 'bar']
在内存中创建一个新的 list
并将名称 a_list
指向它。 a_list
之前指向的内容无关紧要。
a_list[:] = ['foo', 'bar']
调用__setitem__
a_list
对象的方法,带有 slice
作为索引,并在内存中创建一个新的 list
作为值。
__setitem__
评估 slice
以确定它代表的索引,并在它传递的值上调用 iter
。然后它遍历对象,将 slice
指定范围内的每个索引设置为对象的下一个值。对于 list
s,如果 slice
指定的范围与 iterable 的长度不同,则 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
不是一个,iterable 必须是正确的长度:
>>> 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
索引 - 右边的对象必须支持迭代
- 没有名称指向右侧的对象。如果没有其他对它的引用(例如当它是您的示例中的文字时),它将在迭代完成后被计数为不存在。
关于python - 切片整个列表的切片赋值和直接赋值有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10155951/