我在开始新工作之前教自己Python。这是一个Django工作,所以我必须坚持2.7。因此,我正在阅读Hetland的Beginning Python并且不理解他使用切片复制list.extend()
功能的例子。
首先,他通过
显示extend
方法
a = [1, 2, 3]
b = [4, 5, 6]
a.extend(b)
生成[1, 2, 3, 4, 5, 6]
接下来,他通过切片来演示扩展
a = [1, 2, 3]
b = [4, 5, 6]
a[len(a):] = b
产生与第一个例子完全相同的输出。
这是如何工作的? A的长度为3,终止切片索引点为空,表示它运行到列表的末尾。如何将b
值添加到a
?
答案 0 :(得分:3)
Python的切片赋值语法意味着“使此切片等于此值,必要时扩展或缩小列表”。要完全理解它,您可能需要尝试其他一些切片值:
a = [1, 2, 3]
b = [4, 5, 6]
首先,让我们用A
替换部分B
:
a[1:2] = b
print(a) # prints [1, 4, 5, 6, 3]
您可以通过指定零长度切片来添加它们,而不是替换某些值:
a[1:1] = b
print(a) # prints [1, 4, 5, 6, 2, 3]
任何“越界”的切片只是简单地解决了列表一端或另一端的空白区域(太大的正数会解决刚刚结束的点,而太大的负数会解决这一点在开始之前):
a[200:300] = b
print(a) # prints [1, 2, 3, 4, 5, 6]
您的示例代码只使用列表末尾最“准确”的超出边界切片。我不认为这是你故意用于扩展的代码,但它可能是一个有用的边缘情况,你不需要处理特殊的逻辑。
答案 1 :(得分:1)
这只是普通索引的扩展。
>>> L
[1, 2, 3, 4, 5]
>>> L[2] = 42
>>> L
[1, 2, 42, 4, 5]
__setitem__()
method检测到正在使用切片而不是正常索引,并且行为恰当。
答案 2 :(得分:1)
a = [1, 2, 3]
b = [4, 5, 6]
a[len(a):] = b
表示位置len(a)中的元素是b中的元素。这意味着用b扩展a。
答案 3 :(得分:0)
对于演示,请考虑查看list
的子类:
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上运行:
>>> 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上运行:
>>> 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]
当你第一次学习它时会感到困惑,但我想你会学会爱它。