首页 文章

Python列表使用切片扩展功能

提问于
浏览
3

我'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'正在阅读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 回答

  • 1

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

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

    首先,让我们用 B 替换 A 的一部分:

    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]
    

    您的示例代码只使用列表末尾最“准确”的超出范围切片 . 我不认为这是你故意用于扩展的代码,但它可能是一个有用的边缘情况,你不需要处理特殊的逻辑 .

  • 3

    它只是普通索引的扩展 .

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

    setitem() method检测到正在使用切片而不是正常索引,并且行为正常 .

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

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

  • 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]
    

    当你第一次学习它时会感到困惑,但我想你会学会爱它 .

相关问题