Python list extend functionality using slices

I'm teaching myself Python ahead of starting a new job. Its a Django job, so I have to stick to 2.7. As such, I'm reading Beginning Python by Hetland and don't understand his example of using slices to replicate list.extend() functionality.

First, he shows the extend method by

a = [1, 2, 3]
b = [4, 5, 6]
a.extend(b)

produces [1, 2, 3, 4, 5, 6]

Next, he demonstrates extend by slicing via

a = [1, 2, 3]
b = [4, 5, 6]
a[len(a):] = b

which produces the exact same output as the first example.

How does this work? A has a length of 3, and the terminating slice index point is empty, signifying that it runs to the end of the list. How do the b values get added to a ?


Python's slice-assignment syntax means "make this slice equal to this value, expanding or shrinking the list if necessary". To fully understand it you may want to try out some other slice values:

a = [1, 2, 3]
b = [4, 5, 6]

First, lets replace part of A with B :

a[1:2] = b
print(a) # prints [1, 4, 5, 6, 3]

Instead of replacing some values, you can add them by assigning to a zero-length slice:

a[1:1] = b
print(a) # prints [1, 4, 5, 6, 2, 3]

Any slice that is "out of bounds" instead simply addresses an empty area at one end of the list or the other (too large positive numbers will address the point just off the end while too large negative numbers will address the point just before the start):

a[200:300] = b
print(a) # prints [1, 2, 3, 4, 5, 6]

Your example code simply uses the most "accurate" out of bounds slice at the end of the list. I don't think that is code you'd use deliberately for extending, but it might be useful as an edge case that you don't need to handle with special logic.


It's simply an extension of normal indexing.

>>> L
[1, 2, 3, 4, 5]
>>> L[2] = 42
>>> L
[1, 2, 42, 4, 5]

The __setitem__() method detects that a slice is being used instead of a normal index and behaves appropriately.


a = [1, 2, 3]
b = [4, 5, 6]
a[len(a):] = b

means element in a from position len(a) are elements in b. Which means extending a with b.

链接地址: http://www.djcxy.com/p/26758.html

上一篇: 如果list [j]在list [i]之前,list [i:j]保证是一个空列表吗?

下一篇: Python列表使用切片扩展功能