Python语言基础:10_列表

Python语言基础:10_列表

Python3 列表超详细新手教程(全示例 + 逐点讲解 + 避坑指南)

列表(list)是 Python 中最常用的有序可变容器,可以一次性存储多个不同类型的数据,相当于一个 “能随时增减、修改内容的有序货架”。它是后续学习循环、数据处理的基础,本文从零开始逐点讲解,所有代码都可直接复制运行验证。


一、什么是列表?怎么定义?

1. 基础语法

列表用英文方括号[]包裹,内部多个元素用英文逗号,分隔,元素可以是数字、字符串、布尔值,甚至另一个列表。

2. 基础示例

# 存储同类型数据:多个名字 names = ["小明", "小红", "小刚"] # 存储混合类型数据:数字、字符串、布尔值 mix_list = [100, "Python", True, 3.14] # 空列表(后续动态添加数据用) empty_list = [] print(names) print(type(names)) # 查看类型:<class 'list'>

3. 列表核心特点(新手必记)

  1. 有序:元素有固定顺序,每个位置有专属索引(下标)
  2. 可变:可以随时修改、添加、删除元素(和字符串核心区别)
  3. 可重复:同一个值可以出现多次
  4. 支持多类型:同一个列表可以放不同类型的数据

二、列表的索引(下标取值 / 改值)

和字符串一样,列表每个元素都有索引编号,通过索引可以取值、改值。

核心规则

  1. 正向索引:从左往右,从0开始编号
  2. 反向索引:从右往左,从-1开始编号
  3. 索引超出范围会直接报错(新手高频错误)
  4. ✅ 列表可以通过索引修改元素(字符串不行,这是核心差异)
示例演示
fruits = ["苹果", "香蕉", "橙子", "西瓜", "葡萄"] # 元素: 苹果 香蕉 橙子 西瓜 葡萄 # 正向: 0 1 2 3 4 # 反向: -5 -4 -3 -2 -1 # 1. 通过索引取值 print(fruits[0]) # 苹果(第一个元素) print(fruits[2]) # 橙子 print(fruits[-1]) # 葡萄(最后一个元素) print(fruits[-2]) # 西瓜 # 2. 通过索引修改元素(列表可变,字符串不能这么做) fruits[1] = "芒果" print(fruits) # ['苹果', '芒果', '橙子', '西瓜', '葡萄']

❌ 新手易错:索引越界

列表长度为 5,最大正向索引是 4,写fruits[5]会直接报错:

print(fruits[5]) # 报错:IndexError: list index out of range

三、列表的切片(截取子列表)

切片就是从列表中截取一段连续的元素,生成一个新列表,语法规则和字符串切片完全一致。

语法格式

列表[起始索引:结束索引:步长]

核心规则

  1. 左闭右开:包含起始索引元素,不包含结束索引元素
  2. 参数可省略:
    • 起始省略:默认从开头(索引 0)开始
    • 结束省略:默认截取到末尾
    • 步长省略:默认值为 1,挨个取
  3. 切片不会修改原列表,返回的是全新列表

基础示例

nums = [10, 20, 30, 40, 50, 60] # 截取索引1到4(包含1,不包含4) print(nums[1:4]) # [20, 30, 40] # 省略起始:从开头到索引3 print(nums[:3]) # [10, 20, 30] # 省略结束:从索引2到末尾 print(nums[2:]) # [30, 40, 50, 60] # 全省略:复制整个列表 print(nums[:]) # [10, 20, 30, 40, 50, 60]

带步长的切片

nums = [10, 20, 30, 40, 50, 60] # 步长为2:隔一个取一个 print(nums[::2]) # [10, 30, 50] # 步长为-1:反转列表 print(nums[::-1]) # [60, 50, 40, 30, 20, 10]

四、列表的增删改查(核心重点)

4.1 改:修改指定位置元素

通过索引直接赋值即可,前面已经讲过,再巩固一次:

lst = ["a", "b", "c"] lst[0] = "A" print(lst) # ['A', 'b', 'c']

4.2 增:添加元素

共 4 种常用方式,适用场景不同,新手重点区分appendextend

方法作用特点
append(元素)末尾追加单个元素最常用,一次加一个
extend(可迭代对象)末尾批量追加多个元素把元素逐个拆开放进去
insert(索引, 元素)指定索引位置插入元素后面元素自动后移
+ 号拼接两个列表,生成新列表原列表不变
① append () 末尾追加单个元素
lst = [1, 2, 3] lst.append(4) print(lst) # [1, 2, 3, 4] # 追加一个列表:会把整个列表当成一个元素 lst.append([5, 6]) print(lst) # [1, 2, 3, 4, [5, 6]]
② extend () 批量追加元素

把传入的列表 / 字符串等拆成单个元素,逐个追加到末尾:

lst = [1, 2, 3] lst.extend([4, 5, 6]) print(lst) # [1, 2, 3, 4, 5, 6]

⚠️ 新手必辨:append vs extend

  • append:把参数当成一个整体加进去
  • extend:把参数拆成多个元素逐个加进去
a = [1,2] a.append([3,4]) # 结果:[1,2,[3,4]] 长度+1 b = [1,2] b.extend([3,4]) # 结果:[1,2,3,4] 长度+2
③ insert () 指定位置插入
lst = ["a", "b", "c"] # 在索引1的位置插入"x",后面元素后移 lst.insert(1, "x") print(lst) # ['a', 'x', 'b', 'c']
④ + 号拼接列表

生成全新列表,原两个列表都不变:

lst1 = [1, 2] lst2 = [3, 4] lst3 = lst1 + lst2 print(lst3) # [1, 2, 3, 4]

4.3 删:删除元素

共 4 种常用方式,按索引删、按值删、清空,各有适用场景。

方法 / 语句作用特点
del 列表[索引]按索引删除指定元素纯删除,无返回值
pop(索引)删除并返回被删元素不写索引默认删最后一个;有返回值
remove(值)按值删除第一个匹配项找不到会报错
clear()清空整个列表变成空列表
① del 按索引删除
lst = [10, 20, 30, 40] del lst[1] # 删除索引1的元素20 print(lst) # [10, 30, 40]
② pop () 删除并返回元素
lst = [10, 20, 30, 40] # 不写索引,默认删除最后一个 last = lst.pop() print(last) # 40(被删掉的元素) print(lst) # [10, 20, 30] # 指定索引删除 num = lst.pop(0) print(num) # 10 print(lst) # [20, 30]
③ remove () 按值删除
lst = ["苹果", "香蕉", "苹果", "橙子"] lst.remove("苹果") # 删除第一个出现的"苹果" print(lst) # ['香蕉', '苹果', '橙子'] # 不存在的值会报错 # lst.remove("西瓜") # 报错:ValueError: list.remove(x): x not in list
④ clear () 清空列表
lst = [1, 2, 3] lst.clear() print(lst) # []

4.4 查:查找与统计

方法 / 函数作用返回值
元素 in 列表判断元素是否存在True/False
列表.index(元素)查找元素第一次出现的索引索引值,找不到报错
列表.count(元素)统计元素出现次数数字
len(列表)统计列表元素个数数字
max(列表)求最大值最大值
min(列表)求最小值最小值
示例演示
nums = [10, 20, 30, 20, 50] # 1. 判断是否存在 print(20 in nums) # True print(99 in nums) # False # 2. 找元素索引 print(nums.index(30)) # 2 # print(nums.index(99)) # 找不到报错 # 3. 统计次数 print(nums.count(20)) # 2 # 4. 长度 print(len(nums)) # 5 # 5. 最值 print(max(nums)) # 50 print(min(nums)) # 10

⚠️ 注意:max()/min()要求列表元素类型一致,混合数字和字符串会报错。


五、列表常用操作方法

5.1 排序

两种排序方式,新手最容易搞混,务必分清。

① sort ():原地排序(修改原列表,无返回值)

直接对原列表排序,默认从小到大,没有返回值

nums = [3, 1, 4, 2, 5] nums.sort() # 直接修改原列表 print(nums) # [1, 2, 3, 4, 5] # 倒序排序 nums.sort(reverse=True) print(nums) # [5, 4, 3, 2, 1]

❌ 新手大坑:不要用变量接收 sort () 的结果

res = nums.sort() print(res) # None!sort没有返回值
② sorted ():返回新列表(原列表不变)

Python 内置函数,生成一个排序后的新列表,原列表保持不变。

nums = [3, 1, 4, 2, 5] new_nums = sorted(nums) print(new_nums) # [1, 2, 3, 4, 5](新列表) print(nums) # [3, 1, 4, 2, 5](原列表不变)

5.2 反转列表 reverse ()

原地反转列表的顺序:

lst = ["a", "b", "c"] lst.reverse() print(lst) # ['c', 'b', 'a']

5.3 列表复制(新手高频坑)

❌ 错误方式:直接赋值

直接赋值只是给同一个列表起了个别名,两个变量指向同一块内存,改一个另一个跟着变:

list1 = [1, 2, 3] list2 = list1 # 只是多了一个名字,还是同一个列表 list1[0] = 99 print(list2) # [99, 2, 3] list2也跟着变了
✅ 正确复制方式
  1. copy()方法
list1 = [1, 2, 3] list2 = list1.copy() list1[0] = 99 print(list2) # [1, 2, 3] 互不影响
  1. 切片复制
list2 = list1[:] # 效果和copy()一样

六、遍历列表(循环逐个处理元素)

遍历就是把列表里的元素一个一个取出来处理,是循环最常用的场景。

方式 1:直接遍历元素(最常用)

适合只需要元素值,不需要索引的场景:

fruits = ["苹果", "香蕉", "橙子"] for fruit in fruits: print(f"我喜欢吃{fruit}")

输出:

我喜欢吃苹果 我喜欢吃香蕉 我喜欢吃橙子

方式 2:遍历索引(range + len)

适合需要用到元素位置的场景:

fruits = ["苹果", "香蕉", "橙子"] for i in range(len(fruits)): print(f"第{i+1}个水果是:{fruits[i]}")

方式 3:enumerate 同时取索引和值(拓展)

更简洁的写法,同时拿到索引和元素:

fruits = ["苹果", "香蕉", "橙子"] for index, fruit in enumerate(fruits): print(f"索引{index}:{fruit}")

七、嵌套列表(二维列表)

列表里的元素也可以是列表,形成 “二维表格” 一样的结构,叫嵌套列表 / 二维列表。

1. 定义示例

# 3个学生,每个学生有3科成绩 scores = [ [90, 85, 95], # 第0个学生 [88, 92, 80], # 第1个学生 [75, 80, 98] # 第2个学生 ]

2. 取值方法

两层索引,第一层取子列表,第二层取具体元素:

# 取第1个学生的第2科成绩 print(scores[1][2]) # 80 # 取第0个学生的第0科成绩 print(scores[0][0]) # 90

八、拓展:列表推导式(快速生成列表)

一种简洁的生成列表的语法,适合用简单规则生成批量数据,新手先了解基础写法:

# 生成 0~9 的平方列表 # 普通写法 lst = [] for i in range(10): lst.append(i**2) # 列表推导式写法 lst = [i**2 for i in range(10)] print(lst) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

九、新手高频易错点总结

  1. 索引越界:索引从 0 开始,最大索引 = 长度 - 1,超出会报错
  2. append 和 extend 混淆:append 加整体,extend 拆成逐个元素
  3. 用变量接收 sort () 结果:sort 原地修改,返回 None;sorted 才返回新列表
  4. 直接赋值复制列表list2 = list1会联动修改,要用copy()或切片
  5. remove 删除不存在的值:会报错,删除前建议先用in判断是否存在
  6. 混合类型求最值max()/min()要求元素类型一致,不能数字字符串混用
  7. 索引修改字符串:只有列表能通过索引改值,字符串不行,不要搞混