Python list extend functionality using slices
在开始新工作之前,我正在自学Python。这是一个姜戈的工作,所以我必须坚持2.7。因此,我正在阅读Hetland的《开始的Python》,不理解他使用切片复制
首先,他用
1 2 3 | a = [1, 2, 3] b = [4, 5, 6] a.extend(b) |
生产
接下来,他演示了通过切片
1 2 3 | a = [1, 2, 3] b = [4, 5, 6] a[len(a):] = b |
它产生与第一个示例完全相同的输出。
这是怎么工作的?a的长度为3,终止切片索引点为空,表示它运行到列表的末尾。如何将
python的slice赋值语法意味着"使这个slice等于这个值,必要时扩展或收缩列表"。要完全理解它,您可能需要尝试其他一些切片值:
1 2 | a = [1, 2, 3] b = [4, 5, 6] |
首先,让我们用
1 2 | a[1:2] = b print(a) # prints [1, 4, 5, 6, 3] |
不替换某些值,您可以通过分配给零长度切片来添加这些值:
1 2 | a[1:1] = b print(a) # prints [1, 4, 5, 6, 2, 3] |
任何"越界"的切片都只处理列表一端或另一端的空白区域(过大的正数将处理刚结束的点,而过大的负数将处理刚开始的点):
1 2 | a[200:300] = b print(a) # prints [1, 2, 3, 4, 5, 6] |
示例代码只使用列表末尾最"准确"的越界切片。我不认为这是您有意用来扩展的代码,但它可能作为一个边缘案例很有用,您不需要处理特殊的逻辑。
1 2 3 | a = [1, 2, 3] b = [4, 5, 6] a[len(a):] = b |
表示a起始位置len(a)中的元素是b中的元素,这意味着用b扩展a。
它只是普通索引的扩展。
1 2 3 4 5 | >>> L [1, 2, 3, 4, 5] >>> L[2] = 42 >>> L [1, 2, 42, 4, 5] |
为了进行演示,请考虑查看
1 2 3 4 5 6 7 8 9 10 11 | from __future__ import print_function # so I can run on Py 3 and Py 2 class EdList(list): def __setitem__(self,index,value): print('setitem: index={}, value={}'.format(index,value)) list.__setitem__(self,index,value) print(self) def __setslice__(self,i,j,seq): print('setslice: i:{}, j:{}, seq:{}'.format(i,j,seq)) self.__setitem__(slice(i,j),seq) |
在python 3上运行:
1 2 3 4 5 6 7 | >>> a=EdList(range(10)) >>> a[300000:]=[1,2,3] setitem: index=slice(300000, None, None), value=[1, 2, 3] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3] >>> a[1:1]=[4,5,6] setitem: index=slice(1, 1, None), value=[4, 5, 6] [0, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3] |
在python 2上运行:
1 2 3 4 5 6 7 8 9 | >>> a=EdList(range(10)) >>> a[300000:]=[1,2,3] setslice: i:300000, j:9223372036854775807, seq:[1, 2, 3] setitem: index=slice(300000, 9223372036854775807, None), value=[1, 2, 3] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3] >>> a[1:1]=[4,5,6] setslice: i:1, j:1, seq:[4, 5, 6] setitem: index=slice(1, 1, None), value=[4, 5, 6] [0, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3] |
当你第一次学习它时,它是令人困惑的,但我想你会学会去爱它。