是否存在追加和插入都存在的原因?

时间:2015-07-30 19:15:47

标签: python insert append

我肯定不是我想成为的Python大师,我主要是在业余时间学习/试验,很可能我会为有经验的用户提出一个微不足道的问题......但是,我真的很想明白,这个地方对我很有帮助。

现在,在适当的前提下,Python文档说:

  

4.6.3。可变序列类型

     

s.append(x)将x附加到序列的末尾(与...相同)    s [len(s):len(s)] = [x])

     

[...]

     

s.insert(i,x)将x插入到i给出的索引处的s(与...相同)   s [i:i] = [x])

,而且:

  

5.1。更多关于列表

     

list.append(x)将项目添加到列表的末尾。相当于    a [len(a):] = [x]。

     

[...]

     

list.insert(i,x)在给定位置插入一个项目。首先    argument是要插入的元素的索引,所以    a.insert(0,x)插入列表的前面, a.insert(len(a),    x)相当于a.append(x)

所以现在我想知道为什么有两种方法可以做,基本上,同样的事情?如果只有一个append/insert(x, i=len(this)) i可能是一个可选参数,并且在不存在时,是否意味着添加到列表的末尾,这是不是可能(并且更简单)?< / p>

2 个答案:

答案 0 :(得分:6)

此处追加和插入之间的区别与正常用法相同,并且在大多数文本编辑器中。附加添加到列表末尾,而insert将添加到指定索引前面。他们是不同的方法的原因是因为他们做了不同的事情,并且因为append可以被认为是一个快速操作,而insert可能需要一段时间取决于列表的大小和你在哪里'重新插入,因为插入点之后的所有内容都必须重新编制索引。

我并不知道实际原因insertappend采用不同的方法,但我会做出有根据的猜测,它是为了帮助提醒开发人员固有的性能差异。而不是一个insert方法,带有一个可选参数,通常在线性时间内运行,除非未指定参数,在这种情况下它将以恒定时间(非常奇怪)运行,第二种方法将< em>总是是恒定时间被添加。这种类型的设计决策可以在Python的其他地方看到,例如当list.sort等方法返回None而不是新列表时,作为提醒它们是就地操作,而不是创建(并返回)新列表。

答案 1 :(得分:2)

另一个答案很棒 - 但另一个根本区别是insert 慢得多

$ python -m timeit -s 'x=list(range(100000))' 'x.append(1)'
10000000 loops, best of 3: 0.19 usec per loop
$ python -m timeit -s 'x=list(range(100000))' 'x.insert(len(x), 1)'
1000000 loops, best of 3: 0.514 usec per loop

它是 O(n),意味着insert len(x)所需的时间与列表的大小呈线性关系。 append O(1),这意味着无论您的列表有多大,它总是非常快。