关于Python如何将列表实际分配给现有列表的切片,没有太多讨论。
例如,我做了以下事情:
l = [1,2,3,4,5,6]
l[2:5:1] = [7,7,7]
print l #prints [1, 2, 7, 7, 7, 6]
g = [1,2,3,4,5,6]
g[5:2:-1] = [7,7,7]
print g #prints [1, 2, 3, 7, 7, 7]
h = [1,2,3,4,5,6]
h[2:5:1] = [7,7,7,7]
print h #prints [1, 2, 7, 7, 7, 7, 6]
k = [1,2,3,4,5,6]
k[5:2:-1] = [7,7,7,7]
print k #gives a runtime error
有人可以解释一下这是如何工作的,以及为什么最后一个例子没有成功运行,就像它上面的那个(运行h,但不是k)?
答案 0 :(得分:3)
如果切片长度的step
不是1,则切片的长度和指定序列的长度应匹配。
>>> k = [1,2,3,4,5,6]
>>> len(k[5:2:-1])
3
>>> k[5:2:-1] = [7,7,7] # This is okay, lengths are same.
>>> k
[1, 2, 3, 7, 7, 7]
>>> k[5:2:-1] = [7,7,7,7] # not okay
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: attempt to assign sequence of size 4 to extended slice of size 3
如果切片1的长度(默认),则可以指定长度不同的序列;这将改变列表的长度。
>>> k[1:5] = [1]
>>> k
[1, 1, 7]