在Python中附加列表的说明和首选方法

时间:2016-01-29 12:52:01

标签: python list

我正在学习Python,来自C#/ Java背景,并且正在玩列表行为。我已经阅读了一些文档,但是我不知道如何或者为什么,索引大于length-1 make的切片可以附加项目。

ls = ["a", "b", "c", "d"]
n = len(ls)  # n = 4

letter = ls[4]  # index out of range (list indexes are 0 - 3)

# the following all do the same thing

ls += ["echo"]
ls.append("foxtrot")
ls[len(ls):] = ["golf"]  # equivalent to ls[len(ls): len(ls)]

print(ls)

虽然对我来说似乎很奇怪,但我理解切片如何修改它们所操作的列表。我没有得到的是为什么list[len(list)]导致预期的越界错误,但list[len(list):]没有。我理解切片与索引根本不同,而不是当切片以列表值之外的索引开始时内部发生的事情。

为什么我可以从以不存在的元素(len(list))开头的列表中返回切片?为什么这允许我扩展名单?

此外,在上述前三种附加项目的方法中,从惯例或性能角度来看哪一种更受欢迎?它们中的任何一个都存在性能劣势吗?

2 个答案:

答案 0 :(得分:1)

虽然a.append(x)a[len(a):] = [x]执行相同的操作,但第一个更清晰,几乎始终。切片更换可能有一个地方,但你不应该寻找理由这样做。如果情况需要,那么应该明白何时这样做。

从索引返回列表元素的事实开始,切片返回一个"子列表"列表虽然特定元素存在或不存在,但在数学上方便的是将每个列表的空列表视为"子列表"在任何两个相邻位置之间。考虑

>>> a = [1, 2, 3]
>>> a[2:2]
[]

现在考虑以下顺序。在每一步,我们增加切片的起始索引

>>> a[0:]   # A copy of the list
[1, 2, 3]
>>> a[1:]
[2, 3]
>>> a[2:]
[3]

每次我们这样做时,我们会从列表的开头为结果切片删除一个元素。那么当起始索引最终等于最终索引(隐含地是列表的长度)时会发生什么呢?

>>> a[3:]
[]

您将获得空列表,该列表与以下标识一致

a + [] = a
a[:k] + a[k:] = a

(第一个是k >= len(a)的第二个特例。

现在,一旦我们看到为什么切片存在是有意义的,用另一个列表替换该切片意味着什么?换句话说,如果我们将[1, 2, 3]末尾的空列表替换为列表[4],我们会得到什么列表?得到[1, 2, 3, 4],与

一致
[1, 2, 3] + [4] = [1, 2, 3, 4]

考虑另一个序列,这次涉及切片替换。

>>> a = [1,2,3]; a[0:] = ['a']; a
['a']
>>> a = [1,2,3]; a[1:] = ['a']; a
[1, 'a']
>>> a = [1,2,3]; a[2:] = ['a']; a
[1, 2, 'a']
>>> a = [1,2,3]; a[3:] = ['a']; a
[1, 2, 3, 'a']

查看切片替换的另一种方法是将其视为将列表附加到原始子列表。当该子列表是列表本身时,它等于附加到原始列表。

答案 1 :(得分:0)

  

为什么我可以从以不存在的元素开头的列表中返回切片?

我无法确定,但我的猜测是因为可以返回一个合理的值(这里没有任何元素,所以返回一个空列表)。

  

为什么这允许我扩展名单?

您的切片选择列表的最后0个元素。然后,将这些元素替换为另一个列表的元素。

  

此外,在前三个附加项目的方法中,首选哪一个

如果您要添加单个元素,请使用.append();如果您在其他列表中包含元素,请使用.extend()

我不确定性能,但我的猜测是那些已经很好地优化了。