1373 字
7 分钟
Python 札记 (4)
2026-08-27
NOTE

基于 Python 3。

列表#

fruits = ["apple", "banana", "cherry"]
print(fruits[0]) # apple
print(fruits[-1]) # cherry
print(fruits[1:3]) # ['banana', 'cherry']
print("banana" in fruits)
print(len(fruits))

list 有序、可变。下标从 0 起,负数从末尾数。切片左闭右开。

list、tuple、字符串都能做这些事(Common Sequence Operations):in+*[]、切片、lenmin / max

索引与切片#

负索引 i 等价于 len(s) + i。切片 [i:j]i >= j 时为空;省略 i 视为 0,省略 j 视为 len(s)。带步长 [i:j:k] 时,k 为负则方向反向,且 ij 会被截断到合法范围。

nums = [0, 1, 2, 3, 4, 5]
print(nums[::2]) # [0, 2, 4]
print(nums[::-1]) # 新 list,原 list 不变
print(nums[4:1:-1]) # [4, 3, 2]

拼接与重复#

s + ts * n 都会产生新对象。对可变序列反复使用 += 拼接效率较低,可以使用 extendstr.join

[[]] * 3 会使三个元素指向同一个内层 list,修改其中一个,其余也会变化。若需要三个独立的空 list,使用 [[] for _ in range(3)]

count 与 index#

序列还支持(部分类型对 start/stop 有限制):

letters = ["a", "b", "c", "b"]
print(letters.count("b")) # 2
print(letters.index("c")) # 2
# letters.index("z") # ValueError

列表的增删改#

list 可原地增删改(Mutable Sequence Types):

操作效果
s[i] = x替换下标 i
del s[i]删除下标 i
s[i:j] = t用可迭代对象 t 替换切片
del s[i:j]删除切片(同 s[i:j] = []
s += t原地扩展,大致同 s[len(s):len(s)] = t
s *= n原地重复 n

创建列表#

empty = []
from_literal = [1, 2, 3]
from_iter = list("abc") # ['a', 'b', 'c']
from_range = list(range(3)) # [0, 1, 2]

list(iterable) 若参数已是 list,会返回浅拷贝(类似 iterable[:])。

常用方法#

append(x) — 在末尾追加一个元素(不是展开可迭代对象):

stack = [1, 2]
stack.append(3) # [1, 2, 3]
stack.append([4, 5]) # [1, 2, 3, [4, 5]]

extend(iterable) — 把可迭代对象里的元素逐个追加:

a = [1, 2]
a.extend([3, 4]) # [1, 2, 3, 4]
# 等价于 a[len(a):len(a)] = [3, 4]

insert(index, x) — 在指定位置插入;等价于 s[index:index] = [x]

pop([index=-1]) — 取出并删除元素,默认最后一个;空序列或越界会 IndexError

remove(value) — 删除第一个等于 value 的项;找不到则 ValueError(按 == 比较)。

sort(*, key=None, reverse=False)原地排序,只使用 < 比较;返回 None。稳定排序。要新列表用内置 sorted(s)

reverse() — 原地反转,返回 None

copy() — 浅拷贝,等价于 s[:](Python 3.3+)。

items = [3, 1, 4, 1, 5]
items.sort()
print(items) # [1, 1, 3, 4, 5]
items.sort(reverse=True)
print(items) # [5, 4, 3, 1, 1]
dup = items.copy()
dup.reverse()
print(dup) # [1, 1, 3, 4, 5]

原地方法(sortreverseappend 等)多数返回 None;不要写 x = lst.sort()

浅拷贝与嵌套#

copy()[:] 只复制一层。内层可变对象仍共享:

matrix = [[1], [2]]
shadow = matrix.copy()
shadow[0].append(9)
print(matrix) # [[1, 9], [2]] — 内层 list 共用

需要独立嵌套结构时,用 copy.deepcopy()

元组 tuple:不可变序列#

tuple 创建后不能通过 t[i] = x 改元素,也没有 appendsort 等原地方法。优势:可哈希(元素都哈希时)、占内存通常更小、语义上表达「固定字段组合」。

创建与「逗号才是 tuple」#

empty = ()
singleton = (42,) # 单元素必须带逗号
not_tuple = (42) # 这是 int,括号只是分组
pair = 1, 2 # 逗号构成 tuple,括号可省略
from_iter = tuple([1, 2, 3])

真正构成 tuple 的是逗号,括号常可省略;空 tuple 必须是 (),单元素时 (a,) 避免与表达式分组混淆。

不可变 ≠ 内容全不可变#

tuple 不能换引用,但若元素是可变对象,对象内部仍可改:

t = ([1, 2], "ok")
t[0].append(3) # 合法
print(t) # ([1, 2, 3], 'ok')
# t[0] = [] # TypeError: 不能改 tuple 里的引用

含不可哈希元素的 tuple 不能作 dict 键或 set 元素。

哈希与 dict 键#

不可变且元素均可哈希的 tuple 可 hash(),能当 dict 键:

point_index = {(0, 0): "origin", (1, 0): "east"}
print(point_index[(0, 0)])

解包#

平行赋值#

a, b, c = [1, 2, 3]
a, b = b, a # 交换,无需临时变量

左右两侧个数必须一致,否则 ValueError

带 * 的扩展解包#

PEP 3132 / PEP 448:一个带 * 的目标收集「剩余」元素为 list

first, *middle, last = [1, 2, 3, 4, 5]
print(first, middle, last) # 1 [2, 3, 4] 5
head, *tail = "Python"
print(head, tail) # P ['y', 't', 'h', 'o', 'n']

调用函数时,* 把列表展开成多个参数:print(*[1, 2, 3]) 相当于 print(1, 2, 3)

忽略部分值#

_ 作占位(约定俗成,不是语法):

name, _, city = ("Alice", 28, "Seoul")

list 与 tuple 怎么选#

场景倾向
长度或内容会变list
固定字段、函数多返回值tuple
作 dict 键 / set 元素元素可哈希的 tuple
大量只读数据tuple 略省内存

需要「命名访问」时,官方推荐 collections.namedtupledataclass


附录:list 可变序列方法#

Mutable Sequence TypesListslist 另独有 sort()

方法说明返回值
append(value)末尾追加一项None
clear()删除全部(同 del s[:]None
copy()浅拷贝(同 s[:]list
extend(iterable)追加 iterable 中各项None
insert(index, value)在 index 处插入None
pop(index=-1)取出并删除 index 处项被删元素
remove(value)删除首个等于 value 的项None
reverse()原地反转None
sort(*, key=None, reverse=False)原地排序(仅 list)None

序列共有 count(value)index(value[, start[, stop]])

tuple 可用操作小结#

tuple 仅实现不可变序列操作:+*inlenminmax、索引切片、countindex。无 appendsort 等。


参考#

官方文档(中文版):

  1. Sequence Types — list, tuple, range — 共性操作、可变/不可变区分
  2. Common Sequence Operations — 索引、切片、拼接、重复
  3. Mutable Sequence Types — 原地赋值、删除、方法表
  4. Lists — 构造、sort() 关键字参数
  5. Tuples — 单元素逗号、括号与逗号
  6. More on Lists
  7. Tuples and Sequences

PEP:

  1. PEP 3132 — Extended Iterable Unpacking
  2. PEP 448 — Additional Unpacking Generalizations

菜鸟教程:

  1. 菜鸟教程 · 数据结构 — list / tuple 章节

Python 札记 (4)
https://blog.chuwu.top/posts/python/python4/
作者
ChuwuYo
发布于
2026-08-27
许可协议
CC BY-NC-SA 4.0