>>> another_list = [1, 2, 3]
>>> my_list.append(another_list)
>>> my_list
['foo', 'bar', 'baz', [1, 2, 3]]
#^^^^^^^^^--- single item at the end of the list.
def append_one(a_list, element):
a_list.append(element)
def extend_one(a_list, element):
"""creating a new list is semantically the most direct
way to create an iterable to give to extend"""
a_list.extend([element])
import timeit
append
将元素添加到列表中,然后extend
将第一个列表与另一个列表(或另一个iterable,不一定是列表)连接起来append
将其参数作为单个元素添加到列表的末尾。列表本身的长度将增加1。extend
遍历其参数,将每个元素添加到列表中,扩展列表。不管iterable参数中有多少元素,列表的长度都将增加。append
list.append
方法将对象附加到列表的末尾。无论对象是什么,无论是数字、字符串、另一个列表还是其他什么,它都会作为列表中的一个条目添加到
my_list
的末尾。所以请记住,列表是一个对象。如果将另一个列表附加到列表中,则第一个列表将是列表末尾的单个对象(这可能不是您想要的):
extend
list.extend
方法通过附加iterable中的元素来扩展列表:因此,使用extend,iterable的每个元素都被追加到列表中。例如:
请记住,字符串是一个iterable,因此如果使用字符串扩展列表,则在遍历字符串时将附加每个字符(这可能不是您想要的):
运算符重载,
__add__
(+
)和__iadd__
(+=
)为
list
定义了+
和+=
运算符。它们在语义上类似于扩展。my_list + another_list
在内存中创建第三个列表,因此您可以返回其结果,但它要求第二个iterable是一个列表。my_list += another_list
就地修改列表(它是就地运算符,列表是可变对象,如我们所见),因此它不会创建新列表。它也像extend一样工作,因为第二个iterable可以是任何类型的iterable。别搞混了-
my_list = my_list + another_list
不等同于+=
-它给了你一个分配给我的列表的全新列表。时间复杂性
Append有constant time complexity,O(1)。
扩展具有时间复杂性,O(k)。
遍历对
append
的多个调用会增加复杂性,使其等同于extend的调用,而且由于extend的迭代是在C中实现的,因此如果要将iterable中的连续项追加到列表中,则总是会更快。性能
您可能想知道什么性能更好,因为append可以用来实现与extend相同的结果。以下函数执行相同的操作:
所以让我们给他们计时:
对计时进行评论
一位评论人士说:
做语义正确的事情。如果要在iterable中追加所有元素,请使用
extend
。如果只是添加一个元素,请使用append
。好吧,让我们创建一个实验来看看这是如何及时完成的:
我们发现,特意创建一个iterable-to-use扩展只是(很小的)时间浪费:
我们从中了解到,当我们只有一个元素要附加时,使用
extend
没有任何好处。而且,这些时间也没那么重要。我只是让他们明白,在Python中,做语义正确的事情就是以正确的方式做事情™.
可以想象,您可能会在两个可比较的操作上测试计时,并得到一个不明确或相反的结果。专注于做语义正确的事情。
结论
我们看到
extend
在语义上更清晰,并且当您打算将iterable中的每个元素追加到列表中时,它可以比append
,运行得快得多。如果只有一个元素(不在iterable中)要添加到列表中,请使用
append
。^{} :在末尾追加对象。
给你:
[1, 2, 3, [4, 5]]
^{} :通过追加iterable中的元素来扩展list。
给你:
[1, 2, 3, 4, 5]
相关问题 更多 >
编程相关推荐