Python处理字符串和元组不可变性

我们可以通过索引来改变列表中元素的内容,比如:

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# 输出:('妙玉', '贾宝玉', '薛宝钗')

总结:列表和元组的区别,就好比我们四大发明中的活字印刷和石碑。两者都可以刻字,但是前者的各个字模可以根据需要随意调整,适用于书本、传单等内容变化较多的内容。石碑是一块完整的石板,一旦刻好就不能再变,适用于要长期保存的重要内容。 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dr.sky_

作者逐个题目分析的噢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值