3

在开始一份新工作之前,我正在自学 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

4

4 回答 4

5

Python 的切片赋值语法意味着“使这个切片等于这个值,必要时扩展或缩小列表”。要完全理解它,您可能需要尝试一些其他切片值:

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

首先,让我们将部分内容替换AB

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]

您的示例代码只是在列表末尾使用最“准确”的越界切片。我不认为这是您故意用于扩展的代码,但它可能作为一种边缘情况很有用,您不需要使用特殊逻辑来处理。

于 2013-05-18T18:12:26.233 回答
1

它只是普通索引的扩展。

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

__setitem__()方法检测到正在使用切片而不是正常索引并适当地表现。

于 2013-05-18T18:00:29.910 回答
1
a = [1, 2, 3]
b = [4, 5, 6]
a[len(a):] = b

表示从位置 len(a) 开始的 a 中的元素是 b 中的元素。这意味着用 b 扩展 a。

于 2013-05-18T19:12:02.470 回答
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]

当你第一次学习它时会感到困惑,但我认为你会学会喜欢它。

于 2013-05-22T00:16:17.337 回答