我肯定不是我想成为的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>
答案 0 :(得分:6)
此处追加和插入之间的区别与正常用法相同,并且在大多数文本编辑器中。附加添加到列表末尾,而insert将添加到指定索引前面。他们是不同的方法的原因是因为他们做了不同的事情,并且因为append
可以被认为是一个快速操作,而insert
可能需要一段时间取决于列表的大小和你在哪里'重新插入,因为插入点之后的所有内容都必须重新编制索引。
我并不知道实际原因insert
和append
采用不同的方法,但我会做出有根据的猜测,它是为了帮助提醒开发人员固有的性能差异。而不是一个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),这意味着无论您的列表有多大,它总是非常快。