首页 / Python3 入门教程 / 列表

Python3 入门教程

列表

本教程共 70 篇 · 第 12 篇 · 更新于 2026-07-22 · 约 2 分钟阅读

PythonPython3 入门教程Python 列表列表推导式深浅拷贝列表排序

12. 列表

本节目标:掌握列表的增删改查、切片和推导式,能用它处理各种集合数据。

创建列表

列表用方括号包起来,元素之间逗号分隔:

fruits = ["apple", "banana", "cherry"]
mixed = [1, "two", 3.0, True]       # 元素类型可以不同
empty = []                           # 空列表
nested = [1, [2, 3], 4]             # 嵌套列表

也可以用 list() 函数创建:

chars = list("hello")    # ['h', 'e', 'l', 'l', 'o']
nums = list(range(5))    # [0, 1, 2, 3, 4]

索引与切片

列表的索引和切片跟字符串一模一样:

>>> nums = [10, 20, 30, 40, 50]
>>> nums[0]
10
>>> nums[-1]
50
>>> nums[1:4]
[20, 30, 40]
>>> nums[::2]
[10, 30, 50]
>>> nums[::-1]
[50, 40, 30, 20, 10]
Note

列表是可变的,可以通过索引直接修改元素。这是和字符串最大的区别。

修改元素

>>> nums = [10, 20, 30]
>>> nums[1] = 99
>>> nums
[10, 99, 30]

# 批量修改(切片赋值)
>>> nums[1:3] = [88, 77]
>>> nums
[10, 88, 77]

# 插入元素
>>> nums[1:1] = [50, 60]   # 在索引 1 处插入
>>> nums
[10, 50, 60, 88, 77]

# 删除一段
>>> nums[1:3] = []
>>> nums
[10, 88, 77]

增删元素

>>> nums = [1, 2, 3]

# 末尾追加
>>> nums.append(4)
>>> nums
[1, 2, 3, 4]

# 指定位置插入
>>> nums.insert(1, 99)
>>> nums
[1, 99, 2, 3, 4]

# 删除末尾(并返回该元素)
>>> nums.pop()
4
>>> nums
[1, 99, 2, 3]

# 删除指定位置
>>> nums.pop(1)
99
>>> nums
[1, 2, 3]

# 按值删除(只删第一个匹配的)
>>> nums.remove(2)
>>> nums
[1, 3]
Warning

remove() 只删除第一个匹配项。如果元素不存在,会抛 ValueError。不确定是否存在时,先判断:

if 2 in nums:
    nums.remove(2)

查找与统计

>>> nums = [1, 2, 3, 2, 4]
>>> nums.index(2)       # 返回第一个匹配的位置
1
>>> nums.count(2)       # 统计出现次数
2
>>> 5 in nums           # 判断是否存在
False

排序与反转

>>> nums = [3, 1, 4, 1, 5]

# 原地排序(修改原列表,返回 None)
>>> nums.sort()
>>> nums
[1, 1, 3, 4, 5]

# 原地反转
>>> nums.reverse()
>>> nums
[5, 4, 3, 1, 1]

# 降序排序
>>> nums.sort(reverse=True)
>>> nums
[5, 4, 3, 1, 1]

如果不想修改原列表,用 sorted()reversed()

>>> original = [3, 1, 4]
>>> sorted(original)
[1, 3, 4]
>>> original           # 原列表没变
[3, 1, 4]

>>> list(reversed(original))
[4, 1, 3]
Tip

sort()sorted() 快一点点,因为它不需要创建新列表。但如果原列表还有其他变量指向它,用 sorted() 更安全,不会意外修改到别人。

列表推导式

列表推导式是 Python 最优雅的特性之一,用一行代码替代循环:

# 传统写法
squares = []
for x in range(10):
    squares.append(x ** 2)

# 推导式写法
squares = [x ** 2 for x in range(10)]

带条件的推导式:

# 只保留偶数的平方
evens = [x ** 2 for x in range(10) if x % 2 == 0]
# [0, 4, 16, 36, 64]

多层循环的推导式:

>>> [(x, y) for x in [1, 2] for y in ['a', 'b']]
[(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
Note

推导式不宜嵌套太多层,超过两层可读性会急剧下降。复杂逻辑还是用普通循环。

其他常用操作

>>> a = [1, 2]
>>> b = [3, 4]
>>> a + b              # 拼接
[1, 2, 3, 4]
>>> a * 3              # 重复
[1, 2, 1, 2, 1, 2]
>>> len(a)             # 长度
2
>>> max(a)             # 最大值
2
>>> min(a)             # 最小值
1
>>> sum(a)             # 求和
3

浅拷贝与深拷贝

>>> a = [1, 2, [3, 4]]
>>> b = a.copy()       # 或 b = a[:],浅拷贝
>>> b[0] = 99
>>> a                  # a 没变
[1, 2, [3, 4]]
>>> b[2][0] = 99
>>> a                  # a 也变了!因为内层列表是共享的
[1, 2, [99, 4]]

如果需要完全独立的拷贝,用 copy.deepcopy

import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a)
b[2][0] = 99
print(a)    # [1, 2, [3, 4]],不受影响
Warning

简单的一维列表用 copy() 或切片 [:] 就够了。只有嵌套结构才需要深拷贝。深拷贝比浅拷贝慢,别滥用。


来源:参考了 runoob「Python3 列表」、liaoxuefeng「使用 list 和 tuple」、w3cschool「Python3 列表」等,改写后所得。