面试题答案
一键面试append() 原理
append()
方法用于在列表的末尾添加一个新的元素。它直接修改原始列表对象,将传入的对象作为一个整体添加到列表的末尾。其时间复杂度为 O(1),因为在列表末尾添加元素不需要移动其他元素,只涉及到在内存中追加一个对象引用。
extend() 原理
extend()
方法用于将一个可迭代对象(如列表、元组、集合等)的所有元素添加到另一个列表的末尾。它会迭代传入的可迭代对象,并逐个将元素添加到原始列表中。时间复杂度为 O(k),其中 k 是可迭代对象的长度,因为需要遍历可迭代对象的每个元素并添加到列表。
+ 运算符原理
使用 +
运算符连接两个列表时,会创建一个新的列表对象,该新列表包含了两个操作数列表的所有元素。它不会修改原始的列表对象。时间复杂度为 O(m + n),其中 m 和 n 分别是两个操作数列表的长度,因为需要创建一个新列表并复制两个列表的所有元素。
性能场景分析
- 单个元素添加:当需要添加单个元素时,
append()
性能最优。因为extend()
需要将单个元素先转换为可迭代对象,+
运算符会创建新列表。例如:
my_list = []
# 使用 append() 添加单个元素
import timeit
print(timeit.timeit(lambda: my_list.append(1), number = 10000))
- 添加多个元素:如果要添加多个元素,
extend()
性能通常优于+
运算符和多次调用append()
。因为+
运算符创建新列表开销大,多次append()
每次都有 O(1) 操作,整体开销也较大。例如:
my_list = []
new_elements = [1, 2, 3, 4, 5]
# 使用 extend() 添加多个元素
import timeit
print(timeit.timeit(lambda: my_list.extend(new_elements), number = 10000))
- 连接两个列表:如果只是想连接两个列表,且不关心是否修改原始列表,
+
运算符语法简洁,但性能不如extend()
。例如:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
# 使用 + 运算符连接列表
import timeit
print(timeit.timeit(lambda: list1 + list2, number = 10000))
在需要修改原始列表且添加多个元素时,extend()
性能更好;添加单个元素用 append()
;只是想连接列表且不介意创建新列表,+
运算符简洁,但性能稍逊。