脚本专家 发表于 2026-6-17 10:00:03

Python列表与元组核心用法详解:创建、操作、性能对比及实战案例

在Python编程中,列表(list)和元组(tuple)是最基础也最常用的两种序列类型。二者都用于存储有序元素集合,但特性截然不同:列表可变而元组不可变。掌握它们的设计哲学和操作方法,是写出高效Python代码的关键。本文从创建、访问、修改、遍历到高级技巧(如切片、推导式、解包、深浅拷贝),再到性能对比和常见陷阱,带你系统梳理列表与元组的应用。

---

一、列表:灵活的可变序列

列表通过方括号 [] 定义,元素用逗号分隔,支持任意嵌套。


empty = []
numbers =
mixed = ]
range_list = list(range(10))


1. 索引与切片
索引从0开始,支持负索引。切片语法 list 返回子列表。


fruits = ["apple", "banana", "cherry"]
print(fruits)# apple
print(fruits[-1]) # cherry

nums =
print(nums)#
print(nums[::2])#
print(nums[::-1]) #


2. 修改元素
直接通过索引赋值修改。


fruits = "blueberry"
print(fruits) # ['apple', 'blueberry', 'cherry']


3. 添加元素
append(x) 追加到末尾;insert(i, x) 在指定位置插入;extend(iterable) 将可迭代对象的所有元素追加。


fruits.append("orange")
fruits.insert(1, "grape")
fruits.extend(["mango", "kiwi"])
print(fruits) # ['apple', 'grape', 'blueberry', 'cherry', 'orange', 'mango', 'kiwi']


4. 删除元素
pop(i) 弹出并返回索引i处的元素(默认最后一个);remove(x) 删除第一个值为x的元素;del 按索引删除;clear() 清空列表。


last = fruits.pop()      # 删除并返回 'kiwi'
fruits.remove("grape")   # 删除 'grape'
del fruits            # 删除第一个元素
print(fruits)            # ['blueberry', 'cherry', 'orange', 'mango']


5. 查找与统计
index(x) 返回第一个x的索引(不存在则抛出ValueError);count(x) 统计次数;in 检查是否存在。


nums =
print(nums.index(2)) # 1
print(nums.count(2)) # 2
print(3 in nums)   # True


6. 排序与反转
sort() 就地排序;sorted() 返回新列表;reverse() 就地反转。


nums =
nums.sort()
print(nums)    #
nums.reverse()
print(nums)    #


7. 列表推导式
一种简洁创建列表的方式,通常比循环更快。


squares =    #
even =


还支持嵌套循环进行扁平化:


matrix = [, , ]
flat = #


8. 列表的复制
赋值(new = old)只是引用,不创建副本。浅拷贝可用 copy() 或 old[:];深拷贝需 import copy 后使用 copy.deepcopy()。

---

二、元组:不可变的序列

元组用圆括号 () 定义,一旦创建不可修改。


empty = ()
single = (5,)   # 注意逗号,否则是整数
numbers = (1, 2, 3, 4)
mixed = (1, "hello", 3.14)
tuple_from_list = tuple()


索引和切片方式与列表相同。


t = (10, 20, 30, 40)
print(t)    # 20
print(t)# (20, 30)


由于不可变,元组的方法只有 count() 和 index()。若元组中包含可变对象(如列表),该对象内容仍可修改,但元组本身的元素引用不变。

元组的典型用途:
- 保护数据不被意外修改
- 用作字典的键(元组中所有元素必须可哈希)
- 函数返回多个值(自动打包为元组)
- 性能优于列表:创建更快,占用内存更少

---

三、列表与元组的对比

| 特性 | 列表 | 元组 |
|------|------|------|
| 可变性 | 可变(可增删改) | 不可变 |
| 语法 | [] | () |
| 常用方法 | append, extend, insert, remove, pop, sort, reverse, clear | count, index |
| 内存占用 | 较大(支持动态修改) | 较小 |
| 速度 | 略慢 | 略快 |
| 适用场景 | 需要动态修改的数据集 | 固定数据、字典键、函数返回值 |

---

四、序列通用操作

列表和元组都是序列,支持:
- 拼接 +、重复 *
- len()、max()、min()、sum()(仅数值)
- in / not in 成员检查
- for 循环迭代


a =
b =
c = a + b       #
d = a * 3       #
print(len(c))   # 4
print(2 in a)   # True


---

五、高级技巧:解包与星号表达式

将序列解包到多个变量:


point = (10, 20)
x, y = point    # x=10, y=20

first, *rest =    # first=1, rest=
*head, last =    # head=, last=4


在函数调用时可用 * 解包序列作为参数:


args =
print(*args)# 相当于 print(1, 2, 3)


---

六、列表与元组的相互转换

使用 list() 和 tuple() 函数轻松转换。


t = (1, 2, 3)
lst = list(t)   #
t2 = tuple(lst)# (1, 2, 3)


---

七、常见陷阱与最佳实践

1. 列表的浅拷贝问题
只需用 copy() 或切片做的是浅拷贝,内部可变对象仍共享引用。


outer = [, ]
inner = outer.copy()
inner = 99
print(outer)# [, ]外部也被改


解决:使用 copy.deepcopy()。

2. 元组作为字典键
元组中若包含列表等不可哈希对象,则不能作为键。

3. 不要用列表作为函数默认参数
默认参数在函数定义时仅求值一次,多次调用会共用同一列表,导致数据意外累积。


def add_item(item, lst=[]):
    lst.append(item)
    return lst

print(add_item(1))#
print(add_item(2))# 并非预期


正确做法:默认值设为 None,函数内部创建新列表。

4. 列表推导式 vs 循环
推导式通常更快更简洁,但连续复杂嵌套会降低可读性,应保持适度。

5. 使用 enumerate() 获取索引
遍历时需同时获取索引和元素,用 enumerate()。


for i, val in enumerate(fruits):
    print(i, val)


---

八、实战示例

1. 学生成绩管理


scores =
average = sum(scores) / len(scores)
print(f"平均分: {average:.2f}")
failed =
print("不及格人数:", len(failed))


2. 矩阵转置(使用列表推导式)


matrix = [
    ,
    ,
   
]
transposed = [ for row in matrix] for i in range(len(matrix))]
print(transposed)# [, , ]


3. 元组作为坐标


points = [(10,20), (30,40), (50,60)]
for x, y in points:
    print(f"x={x}, y={y}")


4. 用列表实现栈(后进先出)


stack = []
stack.append("a")
stack.append("b")
stack.append("c")
print(stack.pop())# c
print(stack.pop())# b


---

列表和元组是Python数据处理的两大基石。列表可变、方法丰富,适合动态数据;元组不可变、轻量、可哈希,适合固定数据和保护性场景。理解它们的区别,并能根据需求灵活选择,是高效编程的重要技能。在此基础上,可以进一步学习其他序列类型(字符串、range)以及 collections 模块中的 deque、namedtuple 等工具,以应对更复杂的数据结构需求。

热心网友7 发表于 2026-6-17 11:40:00

Re: Python列表与元组核心用法详解:创建、操作、性能对比及实战案例

楼主总结得很全面!列表和元组的对比表格特别清晰,尤其是性能差异和适用场景那块,对我这种刚入门的很有帮助。想问一下,如果元组里嵌套了列表,修改那个列表的元素时,元组本身的引用确实是没变,但实际数据变了,这种情况有没有什么最佳实践来避免意外修改?比如在需要元组作为字典键的时候,是否一定要保证元组里所有元素都不可变?

热心网友5 发表于 2026-6-17 14:15:00

Re: Python列表与元组核心用法详解:创建、操作、性能对比及实战案例

非常详细的总结,收藏了!列表推导式和切片那块写得特别清楚,平时写代码经常用但偶尔会混淆负索引和步长的组合,你这几个例子正好帮我巩固了。另外想请教一个问题:元组做字典键时,如果元组中含有列表这样的可变对象,是不是就不能作为键了?实际开发中一般怎么避免这种情况?

热心网友3 发表于 2026-6-17 16:25:00

Re: Python列表与元组核心用法详解:创建、操作、性能对比及实战案例

非常感谢楼主如此系统地整理了列表和元组的核心用法,结构清晰,从创建、修改到高级特性都覆盖得很全面。特别是性能对比和深浅拷贝的提醒,对新手避免踩坑很有帮助。 有个小疑问:标题里提到了“实战案例”,但正文在“五、高级”后面就结束了,不知道是不是还有后续内容?比如在实际场景中如何取舍列表和元组、或者结合函数返回多个值时的典型用法。期待楼主能继续补充一些应用实例,这样理解会更深刻。再次感谢分享!
页: [1]
查看完整版本: Python列表与元组核心用法详解:创建、操作、性能对比及实战案例