字符串、列表、元组这三个最容易混淆的地方
本文最后更新于5 天前,其中的信息可能已经过时,如有错误请发送邮件到184874483@qq.com

在 Python 入门阶段,str 字符串、list 列表、tuple 元组,常常会一起出现。它们有一个共同点:都可以按顺序存放多个内容。也正因为这一点,初学者很容易把它们混在一起,觉得“看起来都差不多”。但真正写代码时,这三者的用途、写法和能做的操作,其实并不完全一样。

这一节就专门把这三个最容易混淆的地方,放在一起讲清楚。你看完以后,至少要能回答下面几个问题:

  • 它们到底分别是干什么的
  • 它们为什么都能用索引
  • 为什么有的能改,有的不能改
  • 为什么有的用方括号,有的用圆括号
  • 实际写代码时,什么时候该用哪一个

先用一句话区分它们

先不要急着背定义,可以先记住这三个最直白的理解:

  • 字符串 str:表示一段文本
  • 列表 list:表示一组可以修改的数据
  • 元组 tuple:表示一组不想修改的数据

也就是说,它们都可以装“多个东西”,但是使用目的不同。


它们的共同点:都属于序列

之所以初学者容易混淆,是因为这三个类型都有一些很像的地方。它们都属于“序列”,也就是“有顺序地排在一起的一串内容”。

都可以用索引取值

text = "python"
nums = [10, 20, 30]
point = (3, 5)

print(text[0])
print(nums[0])
print(point[0])

输出:

p
10
3

这说明:

  • 字符串的第 0 个位置可以取
  • 列表的第 0 个位置可以取
  • 元组的第 0 个位置也可以取

所以,“支持索引”并不是字符串或列表独有的特点,元组也支持。


都可以切片

text = "python"
nums = [10, 20, 30, 40]
point = (1, 2, 3, 4)

print(text[1:4])
print(nums[1:3])
print(point[1:3])

输出:

yth
[20, 30]
(2, 3)

这里你会看到:

  • 字符串切片后还是字符串
  • 列表切片后还是列表
  • 元组切片后还是元组

都可以用 for 遍历

text = "abc"
nums = [1, 2, 3]
point = (4, 5, 6)

for x in text:
    print(x)

for x in nums:
    print(x)

for x in point:
    print(x)

这也说明它们都能“按顺序一个一个拿出来”。


第一个最容易混淆的地方:它们都能取值,但不是都能改

这是最核心、也是最容易出错的地方。

字符串不能改单个位置

text = "hello"
text[0] = "H"

这会报错。

原因不是索引写错,而是:字符串是不可变类型
也就是说,字符串一旦创建好,里面的字符就不能原地修改。


列表可以改单个位置

nums = [10, 20, 30]
nums[0] = 99
print(nums)

输出:

[99, 20, 30]

这说明:列表是可变类型
它允许你直接修改某个元素。


元组也不能改单个位置

point = (3, 5)
point[0] = 100

这同样会报错。

因为:元组也是不可变类型


这一组一定要记牢

类型能否索引能否直接修改某个位置
字符串 str不能
列表 list
元组 tuple不能

所以,支持索引,不等于支持修改。
这是初学者最容易混淆的第一点。


第二个最容易混淆的地方:它们的写法不同

字符串用引号

name = "Tom"
word = 'hello'

字符串一定要用引号包起来,单引号双引号都可以。


列表用方括号 []

nums = [1, 2, 3]
names = ["Tom", "Jack", "Lucy"]

列表中的元素之间用逗号隔开,外面用方括号包住。


元组用圆括号 ()

point = (3, 5)
colors = ("red", "green", "blue")

元组的形式和列表很像,只是外面变成了圆括号。


但是有一个特殊点:只有一个元素的元组

这点非常容易出错。

a = (5)
print(type(a))

这不是元组,而是整数。

因为 (5) 只是把 5 用括号包起来了,它本质上还是 5

如果你真想表示“只有一个元素的元组”,必须写成:

a = (5,)
print(type(a))

这里最后那个逗号非常关键。

输出是:

<class 'tuple'>

所以你要记住:

  • (5) 不是元组
  • (5,) 才是单元素元组

第三个最容易混淆的地方:它们装的内容看起来像,但意义不同

字符串装的是字符序列

text = "hello"

从表面上看,它像是由 h、e、l、l、o 组成的一串内容。
但 Python 把它当作“文本”来看待。

所以字符串的重点不是“存了很多元素”,而是“表示文字内容”。


列表装的是一组独立元素

nums = [10, 20, 30]

列表更像一个“容器”,里面每个元素都是彼此独立的。
你可以增加、删除、修改其中某一个元素。


元组也装一组元素,但强调“不变”

point = (3, 5)

元组和列表看起来很像,也能放多个元素。
但它更像是在表达:这一组数据是固定的一组,不希望被改动

比如:

  • 一个坐标 (x, y)
  • 一个日期 (year, month, day)
  • 一个学生信息中的固定组合

第四个最容易混淆的地方:它们打印出来的样子不一样

如果直接 print(),三者的表现不同。

text = "hello"
nums = [1, 2, 3]
point = (4, 5)

print(text)
print(nums)
print(point)

输出:

hello
[1, 2, 3]
(4, 5)

这里你可以观察到:

  • 字符串打印时,直接显示内容
  • 列表打印时,会带方括号
  • 元组打印时,会带圆括号

所以以后你看到输出长这样:

  • hello:通常是字符串
  • [1, 2, 3]:通常是列表
  • (4, 5):通常是元组

第五个最容易混淆的地方:它们都能放多个东西,但“该不该改”决定你用哪一个

这一点比死记硬背定义更重要,因为它和“实际写代码”直接相关。

需要修改时,用列表

比如你要存储学生成绩,后面还可能更新:

scores = [80, 90, 85]
scores[1] = 95

这个时候就应该用列表,因为你知道后面会改。


不需要修改时,可以用元组

比如一个点的坐标:

point = (3, 5)

通常我们把这个点理解为“一个固定坐标”,不是拿来频繁改的。
这时元组就很合适。


表示文字内容时,用字符串

比如名字、句子、单词:

name = "Alice"
sentence = "I like Python"

这时候当然不是用列表或元组,而是用字符串。


第六个最容易混淆的地方:字符串的“一个字符”和列表的“一个元素”不是一回事

这个地方很细,但很重要。

字符串取出一个位置,得到的还是字符串

text = "hello"
print(text[0])
print(type(text[0]))

输出:

h
<class 'str'>

也就是说,字符串中的一个“字符”,在 Python 里本质上仍然是字符串,只不过长度为 1。


列表取出一个位置,得到的是该元素本身

nums = [10, 20, 30]
print(nums[0])
print(type(nums[0]))

输出:

10
<class 'int'>

这里取出来的是整数,因为列表里放的就是整数。

所以:

  • 字符串取一个位置,还是字符串
  • 列表取一个位置,是什么元素就得到什么类型

第七个最容易混淆的地方:加号 + 都能用,但意思不完全一样

字符串中的 + 是拼接文本

a = "hello"
b = "world"
print(a + b)

输出:

helloworld

列表中的 + 是合并两个列表

a = [1, 2]
b = [3, 4]
print(a + b)

输出:

[1, 2, 3, 4]

元组中的 + 是连接两个元组

a = (1, 2)
b = (3, 4)
print(a + b)

输出:

(1, 2, 3, 4)

所以虽然三者都可以写 +,但你要理解它们各自连接的是:

  • 字符串:文本
  • 列表:元素序列
  • 元组:固定元素序列

第八个最容易混淆的地方:为什么字符串和元组不能改,列表却能改

这一点你不用一开始就从特别深的原理理解,但要有一个初步认识。

Python 设计这三种类型,本来就是为了不同的用途:

  • 字符串:主要是表示文本,通常不需要原地改字符
  • 列表:主要是存一组可变化的数据,所以允许修改
  • 元组:主要是表示一组固定的数据,所以不允许修改

你可以先把它理解成:

  • 字符串:更像“写好的文字”
  • 列表:更像“可以随时整理的清单”
  • 元组:更像“确定下来的记录”

这个理解对初学阶段已经够用了。


用一个对比例子把三者放在一起看

text = "abc"
nums = ["a", "b", "c"]
point = ("a", "b", "c")

print(text[1])
print(nums[1])
print(point[1])

输出都是:

b

所以表面上看,它们很像。

但是下面就不一样了:

nums[1] = "x"
print(nums)

可以执行,结果是:

['a', 'x', 'c']

而下面两句都会报错:

text[1] = "x"
point[1] = "x"

所以真正的差别不在“能不能取”,而在“能不能改”。


实际写代码时,怎么判断该用哪一个

你可以先问自己三个问题。

问题一:我现在处理的是不是文本?

如果是文本,就优先想到字符串。

例如:

  • 用户姓名
  • 一句话
  • 输入的一行内容
  • 一个单词
name = "Tom"

问题二:我存的是不是一组数据,而且后面可能会改?

如果会改,用列表。

例如:

  • 成绩列表
  • 商品清单
  • 多个数字
  • 多个名字
scores = [90, 85, 100]

问题三:我存的是不是一组固定搭配的数据,不希望改?

如果是,用元组。

例如:

  • 一个坐标
  • 一个日期
  • 一组固定配置
date = (2026, 4, 20)
point = (3, 5)

一个简单对比表,帮助你快速复习

对比项字符串 str列表 list元组 tuple
主要作用表示文本存放一组可变数据存放一组固定数据
写法"hello"[1, 2, 3](1, 2, 3)
是否有顺序
是否能索引
是否能切片
是否能遍历
是否能修改元素不能不能
直接打印效果hello[1, 2, 3](1, 2, 3)

常见错误与易混点

1. 以为“能索引”就一定“能修改”

这是最常见错误。
字符串和元组都能索引,但都不能直接改某个位置。


2. 把元组和列表只看成“括号不一样”

它们不只是括号不一样,更重要的是:

  • 列表可变
  • 元组不可变

括号只是外在形式,核心区别是“能不能改”。


3. 把 (5) 当成元组

这是初学者非常容易踩坑的地方。

a = (5)

这不是元组。

真正的单元素元组要写成:

a = (5,)

4. 把字符串看成“字符列表”

字符串虽然也能一个个取字符,但它不是列表。
它是专门表示文本的类型,很多行为和列表不同。


本节小结

这一节最重要的不是记住很多术语,而是记住下面这三句话:

字符串是文本。
列表是可以修改的一组数据。
元组是不想修改的一组数据。

再进一步,你可以这样记:

  • 都有顺序,所以都能索引、切片、遍历
  • 真正拉开差距的是:列表能改,字符串和元组不能改

如果你把这一层弄明白,后面学习字符串操作、列表操作、函数传参、解包等内容时,会顺很多。


最小可运行例子

你可以直接运行下面这段代码,把三者放在一起感受一下:

text = "python"
nums = [10, 20, 30]
point = (1, 2, 3)

print("字符串:", text)
print("列表:", nums)
print("元组:", point)

print(text[0])
print(nums[0])
print(point[0])

nums[1] = 99
print("修改后的列表:", nums)

你可以自己再试着把:

text[1] = "X"
point[1] = 100

加进去看看报什么错,这样印象会更深。


练习

题目

请你自己写一段程序,完成下面这些事:

  1. 定义一个字符串,内容是 "hello"
  2. 定义一个列表,内容是 [1, 2, 3]
  3. 定义一个元组,内容是 (4, 5, 6)
  4. 分别打印它们的第 1 个元素
  5. 把列表的第 1 个元素改成 99
  6. 再打印修改后的列表

提示

  • 第 1 个元素对应的索引是 0
  • 只有列表可以直接用 列表名[索引] = 新值
  • 字符串和元组先不要尝试修改,否则会报错

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇