小白学 Python
AI 编程指南
© 2026 小白学 Python · 基于 walter201230/Python 教程
课程目录关于本站联系方式隐私政策GitHub

全部课程

  1. 00为什么学 Python
  2. 01Python 安装与第一个程序
  3. 02基本数据类型与变量
  4. 03List 与 Tuple
  5. 04Dict 与 Set
  6. 05条件与循环
  7. 06函数
  8. 07迭代
  9. 08面向对象
  10. 09模块
  11. 10魔法方法
  12. 11枚举类
  13. 12元类 metaclass
  14. 13线程与进程
  15. 14正则表达式
  16. 15闭包
  17. 16装饰器
  18. 17代码可读性
  19. 18pathlib:现代化路径处理
  20. 19异常处理
  21. 20dataclass
  22. 21上下文管理器(with)
  23. 22async / await
  24. 23pyproject.toml + uv
  25. 24ruff:一站式代码检查
  26. 25pytest:测试框架
  27. 26日志 logging
  28. 27打包发布到 PyPI
  29. 28学完之后

List 与 Tuple

完整讲解 · 3 段教学·配 7 道练习题·预计 65 分钟

本页是本章的通读版,可直接读完全部讲解。想动手写代码、跑判分,去 闯关模式。

教学 01 / 03

前言

之前我们学习了字符串,整数,浮点数几种基本数据类型,现在我们接着学习两种新的数据类型,列表(List)和元组(tuple)。

目录

  • 一、List(列表)
    1. 什么是 List(列表)
    2. 怎么创建 List(列表)
    3. 如何访问 List(列表)中的值
    4. 怎么去更新 List(列表)
    5. 怎么删除 List(列表)里面的元素
    6. List(列表)运算符
    7. List(列表)函数 & 方法
    8. 实例
  • 二、tuple(元组)
    1. 什么是元组(tuple)
    2. 怎样创建元组(tuple)
    3. 如何访问元组(tuple)
    4. 修改元组(tuple)
    5. 删除 tuple(元组)
    6. tuple(元组)运算符
    7. 元组内置函数
    8. 实例
教学 02 / 03

一、List(列表)

1、什么是 List (列表)

List (列表)是 Python 内置的一种数据类型。 它是一种有序的集合,可以随时添加和删除其中的元素。

那为什么要有 List (列表)呢?

我们用一个例子来说明。

现在有一个团队要出去玩,要先报名。如果用我们之前学过的知识,那么就是用一个字符串变量把他们都记录起来。

Python· 结合前文阅读
name1 = '一点水'
name2 = '两点水'
name3 = '三点水'
name4 = '四点水'
name5 = '五点水'

但是这样太麻烦了,而且也不美观。

在编程中,一定要学会偷懒,避免「重复性工作」。如果有一百个成员,那么你及时是复制粘贴,也会把你写烦。

这时候就可以使用列表了。

Python· 结合前文阅读
name = ['一点水', '两点水', '三点水', '四点水', '五点水']

就这样,一行代码就可以存放 N 多个名字了。

2、怎么创建 List(列表)

从上面的例子可以分析出,列表的格式是这样的。

列表的组成

其实列表就是用中括号 [] 括起来的数据,里面的每一个数据就叫做元素。每个元素之间使用逗号分隔。

而且列表的数据元素不一定是相同的数据类型。

比如:

Python· 结合前文阅读
list1=['两点水','twowter','liangdianshui',123]

这里有字符串类型,还有整数类型。

我们尝试把他打印出来,看看打印的结果是怎样的。

Python· 可在网页运行
在闯关页练习 →
list1 = ['两点水', 'twowter', 'liangdianshui', 123]

print(list1)

结果如下:

文本
['两点水', 'twowter', 'liangdianshui', 123]

3、如何访问 List(列表)中的值

就像一开始的例子,我们有时候不需要把全部人员的姓名都打印出来,有时候我们需要知道第 3 个报名的人是谁?前两名报名的是谁?

那么怎么从列表中取出来呢?

换种问法就是,怎么去访问列表中的值?

这时候我们可以通过列表的下标索引来访问列表中的值,同样你也可以使用方括号的形式截取字符。

例如:

Python· 可在网页运行
在闯关页练习 →
name = ['一点水', '两点水', '三点水', '四点水', '五点水']

# 通过索引来访问列表
print(name[2])
# 通过方括号的形式来截取列表中的数据
print(name[0:2])

输出的结果:

文本
三点水
['一点水', '两点水']

可见,我们需要知道知道 name 这个列表中第三个报名的是谁?只需要用 name[2] 就可以了。

这里你会问,为什么是 2 ,不是 3 呢?

这是因为在编程世界中,都是从 0 开始的,而不是我们生活习惯中从 1 开始。

所以需要知道第三个是谁?

那就是 name[2] 就可以了。

从例子来看,我们还把 name[0:2] 的结果打印出来了。

从打印结果来看,只打印了第一,第二个元素内容。

这里可能会有疑问?

为什么不是打印前三个啊,不是说 2 就是第 3 个吗?

那是因为这是左闭右开区间的。

所以 name[0:2] 的意思就是从第 0 个开始取,取到第 2 个,但是不包含第 2 个。

还是那句话,为了更好的理解,可以多去尝试,多去玩编程。

所以你可以尝试下下面的各种方式:

Python· 可在网页运行
在闯关页练习 →
name = ['一点水', '两点水', '三点水', '四点水', '五点水']

print(name[0:2])
print(name[:2])
print(name[:])
print(name[1:2])
print(name[0:3])

看看输出的结果:

文本
['一点水', '两点水']
['一点水', '两点水']
['一点水', '两点水', '三点水', '四点水', '五点水']
['两点水']
['一点水', '两点水', '三点水']

根据输出的结果和上面讲到的知识,就很容易理解其中的一些用法了。

文本
## 4、怎么去更新 List(列表) ##

还是一开始的例子,我们用代码记录了报名人的名字,那后面可能会有新人加入,也有可能会发现一开始写错名字了,想要修改。

这时候怎么办呢?

这时候可以通过索引对列表的数据项进行修改或更新,也可以使用 append() 方法来添加列表项。

Python· 可在网页运行
在闯关页练习 →
name = ['一点水', '两点水', '三点水', '四点水', '五点水']


# 通过索引对列表的数据项进行修改或更新
name[1]='2点水'
print(name)

# 使用 append() 方法来添加列表项
name.append('六点水')
print(name)

输出的结果:

文本
['一点水', '2点水', '三点水', '四点水', '五点水']
['一点水', '2点水', '三点水', '四点水', '五点水', '六点水']

5、怎么删除 List(列表) 里面的元素

那既然这样,肯定会有人中途退出的。

那么我们就需要在列表中,把他的名字去掉。

这时候使用 del 语句来删除列表的的元素

Python· 可在网页运行
在闯关页练习 →
name = ['一点水', '两点水', '三点水', '四点水', '五点水']

print(name)

# 使用 del 语句来删除列表的的元素
del name[3]
print(name)

输出的结果:

文本
['一点水', '两点水', '三点水', '四点水', '五点水']
['一点水', '两点水', '三点水', '五点水']

你看输出的结果,列表中已经没有了 四点水 这个数据了。证明已经删除成功了。

6、List(列表)运算符

列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。

Python 表达式结果描述
len([1, 2, 3])3计算元素个数
[1, 2, 3] + [4, 5, 6][1, 2, 3, 4, 5, 6]组合
['Hi!'] * 4['Hi!', 'Hi!', 'Hi!', 'Hi!']复制
3 in [1, 2, 3]True元素是否存在于列表中
for x in [1, 2, 3]: print x,1 2 3迭代

7、List (列表)函数&方法

函数&方法描述
len(list)列表元素个数
max(list)返回列表元素最大值
min(list)返回列表元素最小值
list(seq)将元组转换为列表
list.append(obj)在列表末尾添加新的对象
list.count(obj)统计某个元素在列表中出现的次数
list.extend(seq)在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
list.index(obj)从列表中找出某个值第一个匹配项的索引位置
list.insert(index, obj)将对象插入列表
list.pop(obj=list[-1])移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
list.remove(obj)移除列表中的一个元素(参数是列表中元素),并且不返回任何值
list.reverse()反向列表中元素
list.sort([func])对原列表进行排序

8、实例

最后通过一个例子来熟悉了解 List 的操作

例子:

Python· 可在网页运行
在闯关页练习 →
#-*-coding:utf-8-*-
#-----------------------list的使用----------------------------------

# 1.一个产品,需要列出产品的用户,这时候就可以使用一个 list 来表示
user=['liangdianshui','twowater','两点水']
print('1.产品用户')
print(user)

# 2.如果需要统计有多少个用户,这时候 len() 函数可以获的 list 里元素的个数
len(user)
print('\n2.统计有多少个用户')
print(len(user))

# 3.此时,如果需要知道具体的用户呢?可以用过索引来访问 list 中每一个位置的元素,索引是0从开始的
print('\n3.查看具体的用户')
print(user[0]+','+user[1]+','+user[2])

# 4.突然来了一个新的用户,这时我们需要在原有的 list 末尾加一个用户
user.append('茵茵')
print('\n4.在末尾添加新用户')
print(user)

# 5.又新增了一个用户,可是这个用户是 VIP 级别的学生,需要放在第一位,可以通过 insert 方法插入到指定的位置
# 注意:插入数据的时候注意是否越界,索引不能超过 len(user)-1
user.insert(0,'VIP用户')
print('\n5.指定位置添加用户')
print(user)

# 6.突然发现之前弄错了,“茵茵”就是'VIP用户',因此,需要删除“茵茵”;pop() 删除 list 末尾的元素
user.pop()
print('\n6.删除末尾用户')
print(user)

# 7.过了一段时间,用户“liangdianshui”不玩这个产品,删除了账号
# 因此需要要删除指定位置的元素,用pop(i)方法,其中i是索引位置
user.pop(1)
print('\n7.删除指定位置的list元素')
print(user)

# 8.用户“两点水”想修改自己的昵称了
user[2]='三点水'
print('\n8.把某个元素替换成别的元素')
print(user)

# 9.单单保存用户昵称好像不够好,最好把账号也放进去
# 这里账号是整数类型,跟昵称的字符串类型不同,不过 list 里面的元素的数据类型是可以不同的
# 而且 list 元素也可以是另一个 list
newUser=[['VIP用户',11111],['twowater',22222],['三点水',33333]]
print('\n9.不同元素类型的list数据')
print(newUser)

输出的结果:

文本
1.产品用户
['liangdianshui', 'twowater', '两点水']

2.统计有多少个用户
3

3.查看具体的用户
liangdianshui,twowater,两点水

4.在末尾添加新用户
['liangdianshui', 'twowater', '两点水', '茵茵']

5.指定位置添加用户
['VIP用户', 'liangdianshui', 'twowater', '两点水', '茵茵']

6.删除末尾用户
['VIP用户', 'liangdianshui', 'twowater', '两点水']

7.删除指定位置的list元素
['VIP用户', 'twowater', '两点水']

8.把某个元素替换成别的元素
['VIP用户', 'twowater', '三点水']

9.不同元素类型的list数据
[['VIP用户', 11111], ['twowater', 22222], ['三点水', 33333]]

名单复制以后,怎么还会一起变

还用前面的报名名单。我们想留一份原来的名单,再往当前名单里加一个人。各位看看,下面的两个赋值做的是同一件事吗?

Python· 可在网页运行
在闯关页练习 →
names = ['一点水', '两点水']
another_name = names
saved_names = names.copy()
another_name.append('三点水')
print(names)
print(saved_names)

输出:

文本
['一点水', '两点水', '三点水']
['一点水', '两点水']

another_name = names 多了一个指向原列表的名字,names.copy() 则建立一个新的列表。修改原列表的外层元素,不会让这个新列表自动跟着变。

自己再把 names 换成空列表,追加一个名字,看看两份结果。接着想一下:如果名单里的元素本身又是列表,copy() 会把里面的每个列表也重新建立一份吗?不会,普通列表复制是浅拷贝。遇到嵌套对象时,要继续检查里面的对象有没有共享。

列表适合保存会变化的、有先后顺序的一组内容。元组不能重新赋值其中某个位置,但如果元组里面放了列表,那个列表的内容仍然可以修改。把「外层位置不能改」和「里面的对象也不能改」分清楚,就不容易被看起来相似的代码绕住。

练习 1 / 7创建第一个 List

创建一个变量 numbers,把整数 1, 2, 3, 4, 5 装到一个 List 里赋给它。

然后用 print 打印 numbers。

输出应该是:

文本
[1, 2, 3, 4, 5]
💡 提示(2 条)
  1. List 的写法是 [元素1, 元素2, ...]

  2. 完整代码:

    Python
    numbers = [1, 2, 3, 4, 5]
    print(numbers)
在编辑器里写这题,跑判分、看参考答案去闯关页做这题 →
练习 2 / 7索引和切片

已经给你定义了 fruits = ['apple', 'banana', 'cherry', 'date', 'fig']。

请:

  1. 用索引 print 出第 3 个元素(也就是 cherry)
  2. 用切片 print 出 fruits[1:4]

输出应该是:

文本
cherry
['banana', 'cherry', 'date']
💡 提示(3 条)
  1. 索引从 0 开始:第 3 个元素是 fruits[2]

  2. 切片 [1:4] 是左闭右开,包含索引 1、2、3,不包含 4

  3. 完整代码:

    Python
    fruits = ['apple', 'banana', 'cherry', 'date', 'fig']
    print(fruits[2])
    print(fruits[1:4])
在编辑器里写这题,跑判分、看参考答案去闯关页做这题 →
练习 3 / 7修改 + 追加

已经给你定义了 colors = ['red', 'green', 'blue']。

请:

  1. 把索引 1 处的元素(green)改成大写 GREEN
  2. 用 append 在末尾追加 'yellow'
  3. print(colors)

输出应该是:

文本
['red', 'GREEN', 'blue', 'yellow']
💡 提示(3 条)
  1. 改某个位置:colors[1] = 'GREEN'

  2. 末尾追加:colors.append('yellow')

  3. 完整代码:

    Python
    colors = ['red', 'green', 'blue']
    colors[1] = 'GREEN'
    colors.append('yellow')
    print(colors)
在编辑器里写这题,跑判分、看参考答案去闯关页做这题 →
练习 4 / 7拼接与长度

已经给你定义了 a = [1, 2, 3] 和 b = [4, 5, 6]。

请:

  1. 用 + 把它们拼成新的列表 c
  2. print(c)
  3. 用 len() 打印 c 的元素个数

输出应该是:

文本
[1, 2, 3, 4, 5, 6]
6
💡 提示(3 条)
  1. List 之间可以用 + 拼接:c = a + b

  2. len(c) 返回列表的元素个数

  3. 完整代码:

    Python
    a = [1, 2, 3]
    b = [4, 5, 6]
    c = a + b
    print(c)
    print(len(c))
在编辑器里写这题,跑判分、看参考答案去闯关页做这题 →
教学 03 / 03

二、tuple(元组)

1、什么是元组 (tuple)

上一节刚说了一个有序列表 List ,现在说另一种有序列表叫元组:tuple 。

tuple 和 List 非常类似,但是 tuple 一旦初始化就不能修改。 也就是说元组(tuple)是不可变的,那么不可变是指什么意思呢?

元组(tuple) 不可变是指当你创建了 tuple 时候,它就不能改变了,也就是说它也没有 append(),insert() 这样的方法,但它也有获取某个索引值的方法,但是不能赋值。

那么为什么要有 tuple 呢?

那是因为 tuple 是不可变的,所以代码更安全。

所以建议能用 tuple 代替 list 就尽量用 tuple 。

2、怎样创建元组(tuple)

元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

Python· 结合前文阅读
tuple1=('两点水','twowter','liangdianshui',123,456)
tuple2='两点水','twowter','liangdianshui',123,456

创建空元组

Python· 结合前文阅读
tuple3=()

元组中只包含一个元素时,需要在元素后面添加逗号

Python· 结合前文阅读
tuple4=(123,)

如果不加逗号,创建出来的就不是 元组(tuple),而是指 123 这个数了。

这是因为括号 () 既可以表示元组(tuple),又可以表示数学公式中的小括号,这就产生了歧义。

所以如果只有一个元素时,你不加逗号,计算机就根本没法识别你是要进行整数或者小数运算还是表示元组。

因此,Python 规定,这种情况下,按小括号进行计算,计算结果自然是 123 ,而如果你要表示元组的时候,就需要加个逗号。

具体看下图 tuple4 和 tuple5 的输出值

Python· 可在网页运行
在闯关页练习 →
#-*-coding:utf-8-*-
tuple1 = ('两点水', 'twowter', 'liangdianshui', 123, 456)
tuple2 = '两点水', 'twowter', 'liangdianshui', 123, 456
tuple3 = ()
tuple4 = (123,)
tuple5 = (123)
print(tuple1)
print(tuple2)
print(tuple3)
print(tuple4)
print(tuple5)

输出的结果:

文本
('两点水', 'twowter', 'liangdianshui', 123, 456)
('两点水', 'twowter', 'liangdianshui', 123, 456)
()
(123,)
123

3、如何访问元组(tuple)

元组下标索引也是从 0 开始,元组(tuple)可以使用下标索引来访问元组中的值。

Python· 可在网页运行
在闯关页练习 →
#-*-coding:utf-8-*-

tuple1=('两点水','twowter','liangdianshui',123,456)
tuple2='两点水','twowter','liangdianshui',123,456

print(tuple1[1])
print(tuple2[0])

输出的结果:

文本
twowter
两点水

4、修改元组 (tuple)

可能看到这个小标题有人会疑问,上面不是花了一大段来说 tuple 是不可变的吗?

这里怎么又来修改 tuple (元组) 了。

那是因为元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,还有通过修改其他列表的值从而影响 tuple 的值。

具体看下面的这个例子:

Python· 可在网页运行
在闯关页练习 →
#-*-coding:utf-8-*-
list1=[123,456]
tuple1=('两点水','twowater','liangdianshui',list1)
print(tuple1)
list1[0]=789
list1[1]=100
print(tuple1)

输出的结果:

文本
('两点水', 'twowater', 'liangdianshui', [123, 456])
('两点水', 'twowater', 'liangdianshui', [789, 100])

可以看到,两次输出的 tuple 值是变了的。我们看看 tuple1 的存储是怎样的。

元组中的可变对象

可以看到,tuple1 有四个元素,最后一个元素是一个 List ,List 列表里有两个元素。

当我们把 List 列表中的两个元素 124 和 456 修改为 789 和 100 的时候,从输出来的 tuple1 的值来看,好像确实是改变了。

但其实变的不是 tuple 的元素,而是 list 的元素。

tuple 一开始指向的 list 并没有改成别的 list,所以,tuple 所谓的“不变”是说,tuple 的每个元素,指向永远不变。注意是 tupe1 中的第四个元素还是指向原来的 list ,是没有变的,我们修改的只是列表 List 里面的元素。

5、删除 tuple (元组)

tuple 元组中的元素值是不允许删除的,但我们可以使用 del 语句来删除整个元组

Python· 可在网页运行
在闯关页练习 →
#-*-coding:utf-8-*-

tuple1=('两点水','twowter','liangdianshui',[123,456])
print(tuple1)
del tuple1

6、tuple (元组)运算符

与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

Python 表达式结果描述
len((1, 2, 3))3计算元素个数
(1, 2, 3) + (4, 5, 6)(1, 2, 3, 4, 5, 6)连接
('Hi!',) * 4('Hi!', 'Hi!', 'Hi!', 'Hi!')复制
3 in (1, 2, 3)True元素是否存在
for x in (1, 2, 3): print(x)1 2 3迭代

7、元组内置函数

方法描述
len(tuple)计算元组元素个数
max(tuple)返回元组中元素最大值
min(tuple)返回元组中元素最小值
tuple(seq)将列表转换为元组

8、实例

最后跟列表一样,来一个实例,大家也可以多尝试,去把元组的各种玩法玩一遍。

Python· 可在网页运行
在闯关页练习 →
name1 = ('一点水', '两点水', '三点水', '四点水', '五点水')

name2 = ('1点水', '2点水', '3点水', '4点水', '5点水')

list1 = [1, 2, 3, 4, 5]

# 计算元素个数
print(len(name1))
# 连接,两个元组相加
print(name1 + name2)
# 复制元组
print(name1 * 2)
# 元素是否存在 (name1 这个元组中是否含有一点水这个元素)
print('一点水' in name1)
# 元素的最大值
print(max(name2))
# 元素的最小值
print(min(name2))
# 将列表转换为元组
print(tuple(list1))

输出的结果如下:

文本
5
('一点水', '两点水', '三点水', '四点水', '五点水', '1点水', '2点水', '3点水', '4点水', '5点水')
('一点水', '两点水', '三点水', '四点水', '五点水', '一点水', '两点水', '三点水', '四点水', '五点水')
True
5点水
1点水
(1, 2, 3, 4, 5)
练习 5 / 7单元素 tuple 的逗号陷阱

请创建一个只有一个元素 42 的元组 t,然后 print(t)。

注意:单元素的 tuple 必须在元素后面加逗号 —— (42,) 才是 tuple,(42) 是数字 42。

输出应该是:

文本
(42,)
💡 提示(3 条)
  1. (42) 是一个数字表达式,不是 tuple

  2. (42,) 才是 tuple — 注意逗号

  3. 完整代码:

    Python
    t = (42,)
    print(t)
在编辑器里写这题,跑判分、看参考答案去闯关页做这题 →
练习 6 / 7tuple 取值与切片

已经给你定义了 days = ('Mon', 'Tue', 'Wed', 'Thu', 'Fri')。

请:

  1. print 第 4 个元素(也就是 Thu)
  2. print 切片 days[2:4]

输出应该是:

文本
Thu
('Wed', 'Thu')
💡 提示(3 条)
  1. 索引从 0 开始:第 4 个是 days[3]

  2. 切片用法跟 List 一样:days[2:4]

  3. 完整代码:

    Python
    days = ('Mon', 'Tue', 'Wed', 'Thu', 'Fri')
    print(days[3])
    print(days[2:4])
在编辑器里写这题,跑判分、看参考答案去闯关页做这题 →
练习 7 / 7list 转 tuple + max

已经给你定义了 nums = [3, 1, 4, 1, 5, 9, 2, 6]。

请:

  1. 用 tuple() 把它转成元组,赋给 t
  2. print 这个 tuple 的元素个数(len)
  3. print 这个 tuple 里的最大值(max)

输出应该是:

文本
8
9
💡 提示(3 条)
  1. tuple(nums) 把 list 转成 tuple

  2. len 算个数,max 取最大值

  3. 完整代码:

    Python
    nums = [3, 1, 4, 1, 5, 9, 2, 6]
    t = tuple(nums)
    print(len(t))
    print(max(t))
在编辑器里写这题,跑判分、看参考答案去闯关页做这题 →

读完了?动手练一遍才算真会。

去闯关模式练习 →
← 上一章02 · 基本数据类型与变量
List 与 Tuple
下一章 →04 · Dict 与 Set
本章目录

List 与 Tuple

  1. 教学 01前言
  2. 教学 02一、List(列表)
  3. 练习 1创建第一个 List
  4. 练习 2索引和切片
  5. 练习 3修改 + 追加
  6. 练习 4拼接与长度
  7. 教学 03二、tuple(元组)
  8. 练习 5单元素 tuple 的逗号陷阱
  9. 练习 6tuple 取值与切片
  10. 练习 7list 转 tuple + max

学习目录