我们可以通过索引来改变列表中元素的内容,比如:
names = ['鲁班七号', '蔡文姬', '甄姬', '亚瑟', '兰陵王']
2names[0] = '后裔'
3print(names)
4# 输出:['后裔', '蔡文姬', '甄姬', '亚瑟', '兰陵王']
但字符串一旦创建后是不可改变的,这个属性和元组类似,通过索引来改变字符串中元素就会报错:
name = '鹿班七号'
2name[0] = '鲁'
3print(name)
4# 报错:TypeError: 'str' does not support item assignment on line 2
那么我们怎样才能修改字符串的内容呢?答案是使用字符串分片和拼接去生成一个新的字符串,看个例子:
name = '鹿班七号'
2new_name = '鲁' + name[1:]
3print(new_name)
4# 输出:鲁班七号
元组和列表非常相似。不同之处在于,外观上:列表是被方括号包裹起来的,而元组是被 圆括号 包裹起来的。本质上:列表里的元素可修改,元组里的元素是 不可以“增删改” 的。
还有一个微妙的地方要注意,就是只有一个元素的元组,在格式上与列表是不同的。仅一个元素 x 的列表写成 [x]
, 但仅一个元素的元组要在括号内多写个逗号:(x,)
。
这是因为 Python 中,圆括号承担的语法功能太多了,可以用来表示元组,也可以用于当数学运算中的小括号。(x)
这样的写法,Python 会优先理解成数学运算的小括号,所以光秃秃的 (x)
对 Python 来说就是一个套了个小括号的数学运算表达式。我们来看看代码:
single = (1,)
2print(type(single))
3# 输出:<class 'tuple'>
函数的多返回值返回其实就是一个元组
def new_kids():
2 kid1 = '野原新之助'
3 kid2 = '风间彻'
4 kid3 = '佐藤正男'
5 kid4 = '樱田妮妮'
6 # 多个值在 return 后并列,用英文逗号间隔开
7 return kid1, kid2, kid3, kid4
8
9print(new_kids())
10print(type(new_kids()))
11# 输出:
12# ('野原新之助', '风间彻', '佐藤正男', '樱田妮妮')
13# <class 'tuple'>
有了元组这种相对稳定的数据结构,我们就再也不怕手滑把数据改掉啦!
如果真的非要去改元组内部的数据,将会报错的哦:
students = ('林黛玉', '贾宝玉', '薛宝钗')
2
3students.append('史湘云')
4# 报错:AttributeError: 'tuple' object has no attribute 'append'
5# (属性错误:元组对象没有 append 属性)
6# 补充说明:关于“对象”“属性”,我们在后面的课程会说
7
8students[2] = '袭人'
9# 报错:TypeError: 'tuple' object does not support item assignment
10#(类型错误:元组对象不支持给其中元素赋值)
11
12del students[1]
13# 报错:TypeError: 'tuple' object doesn't support item deletion
14# (类型错误:元组对象不支持删除操作)
除了上述例子外,其它的用于增加、修改或删除语句和方法都不能用在元组上。但是,由于查询与分片操作并不会改变数据,所以我们说的两种列表元素的查询方式以及分片操作,在元组中是可用的。
students = ('林黛玉', '贾宝玉', '薛宝钗')
2
3print(students[1])
4# 输出:贾宝玉
5
6print(students.index('贾宝玉'))
7# 输出:1
8
9print(students[:2])
10# 输出:('林黛玉', '贾宝玉')
列表运算符,元组也都支持。用 in
查询元素是否在元组内;用 +
将两个元组叠加生成新元组;用 *
生成元素重复循环多次的新元组。
students = ('林黛玉', '贾宝玉', '薛宝钗')
2
3daiyu_in = '林黛玉' in students
4print(daiyu_in)
5# 输出:True
6
7students_plus = students + students
8print(students_plus)
9# 输出:('林黛玉', '贾宝玉', '薛宝钗', '林黛玉', '贾宝玉', '薛宝钗')
10
11students_triple = students * 3
12print(students_triple)
13# 输出:('林黛玉', '贾宝玉', '薛宝钗', '林黛玉', '贾宝玉', '薛宝钗', '林黛玉', '贾宝玉', '薛宝钗')
如果真的有特殊需求,需要修改元组中的元素怎么办?
在这里有一个思路,可以先用 list()
函数把元组转换成列表,相当于给数据“解锁”,将元素修改完毕后,再用 tuple()
函数转换回元组,相当于“重新上锁”。
students = ('林黛玉', '贾宝玉', '薛宝钗')
2
3# 用 list() 函数给数据“解锁”,生成一个相同元素的新列表
4students_list = list(students)
5
6# 在新列表中修改元素
7students_list[0] = '妙玉'
8
9# 两次给数据“上锁”
10students = tuple(students_list)
11
12print(students)
13# 输出:('妙玉', '贾宝玉', '薛宝钗')
总结:列表和元组的区别,就好比我们四大发明中的活字印刷和石碑。两者都可以刻字,但是前者的各个字模可以根据需要随意调整,适用于书本、传单等内容变化较多的内容。石碑是一块完整的石板,一旦刻好就不能再变,适用于要长期保存的重要内容。