讲解
列表(list)是有序、可变的数据容器,用方括号创建:nums = [1, 2, 3]。列表可以装任意类型的值,实践中建议装同类型。通过下标访问元素,从 0 开始,负数下标从尾部数(nums[-1] 是最后一个);切片和字符串完全一样:nums[1:3]、nums[::-1] 反转,含头不含尾。len() 返回长度,in 判断元素是否存在。
列表可变,这是它和字符串的本质区别:nums[0] = 99 直接改元素,append 在末尾追加,insert 在指定位置插入,remove 按值删除第一个匹配项,pop 按下标弹出(默认最后一个),del nums[1] 删除指定下标。加元素用 append 是一个一个加,extend 是把另一个列表的元素逐个并入——append([1, 2]) 会把整个列表当成一个元素塞进去,这是新手高发错误。
列表是引用类型:b = a 之后 a 和 b 指向同一个列表,改 b 影响 a。要复制一个独立的列表用 a.copy() 或 a[:] 或 list(a)——但注意这都是浅拷贝,嵌套列表仍然共享,深拷贝要用 copy 模块的 deepcopy。排序用 list.sort()(就地排序,返回 None)或内置 sorted()(返回新列表),反向参数 reverse=True,自定义规则用 key 参数,比如按长度排 key=len。下一节专门过一遍列表的方法清单。
示例
nums = [10, 20, 30, 40]
print('第一个:', nums[0], ',最后一个:', nums[-1], ',长度:', len(nums))
print('切片:', nums[1:3], ',反转:', nums[::-1])
print('20 在不在:', 20 in nums)
# 可变:直接改元素
nums[0] = 99
print('改完后:', nums)
# 尾部追加 vs 并入
fruits = ['苹果']
fruits.append('香蕉')
print('append:', fruits)
fruits.extend(['橙子', '西瓜'])
print('extend:', fruits)
fruits.append(['葡萄', '芒果']) # 整个列表变成一个元素!
print('append 一个列表:', fruits)
# 删除三剑客
data = [1, 2, 3, 2]
data.remove(2) # 按值删第一个
print('remove 后:', data)
last = data.pop() # 弹出末尾
print('pop 弹出:', last, ',剩余:', data)
# 引用与拷贝
a = [1, 2, 3]
b = a
b.append(4)
print('a 也变了:', a)
c = a.copy()
c.append(5)
print('拷贝互不影响:', a, c)
# sort 就地、sorted 返回新列表
scores = [88, 75, 92]
print('sorted:', sorted(scores), ',原列表:', scores)
scores.sort(reverse=True)
print('sort 降序后:', scores)
words = ['ccc', 'a', 'bb']
print('按长度排:', sorted(words, key=len))
常见坑
- append 和 extend 混淆:append 把参数整体当一个元素,extend 把参数的元素逐个并入。想合并两个列表用 extend 或 +。
- sort() 返回 None:result = nums.sort() 之后 result 是 None——sort 就地排序,要新列表用 sorted(nums)。
- 浅拷贝共享嵌套:a = [[1], [2]] 的 a.copy() 只拷外层,改内层仍互相影响。嵌套结构深拷贝用 copy.deepcopy。
- remove 找不到会抛错:list.remove(x) 在 x 不存在时抛 ValueError,不确定存在就先 if x in list 或改用列表推导式过滤。
小结
列表有序可变,下标从 0、负数从尾、切片含头不含尾;append 加单个、extend 并入多个;b = a 是共享引用,拷贝用 copy();sort 就地、sorted 出新。下一节系统过一遍列表方法。