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

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

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

Python处理字符串和元组不可变性相关推荐

  1. python统计字符串个数_python字符串中字符出现次数(python获取字符串个数)

    原博文 2020-03-17 19:25 − 今天要说的是Python的字符串函数还是很方便的,只需要调用 count() 方法即可. 最近,我在一个网站上看到了一个自然语言处理课程.我详细解释了一些 ...

  2. python语言字符串_python中字符串的常见操作方法

    原博文 2019-09-06 09:49 − 1. 字符串概念,字符串是一个容器,包含若干个字符并按照一定的顺序组织成一个整体.字符串支持索引操作. 2. 创建字符串基本语法 变量名 = " ...

  3. python序列_科学网—Python:序列(字符串、列表、元组)和序列函数 - 刘洋洋的博文...

    Python中的序列,包括字符串(String).列表(List).元组(Tuple). 序列的索引 通过索引(index)访问及获得的序列的一个或多个元素,也叫切片. 正序: 0 到 N-1 倒序: ...

  4. python 字符串去重从小到大排列_python 序列(字符串、字符串、元组、集合、字典)...

    运行环境:python3.8 Anaconda 字符串 在python中,单个字符就是字符串. 字符串不可改变,使用单引号' ',双引号" ",三引号'" "' ...

  5. Python(字符串,列表,元组,字典)

    1.字符串:标识" " PS:字符串是%s:整数是%d:浮点数%f strip:移除(空白或者特定字符) split:分割 len:长度(获取元素的个数) 索引 切片 2.列表li ...

  6. Python 字符串/列表/元组/字典之间的相互转换 - Python零基础入门教程

    目录 一.字符串 str 与列表 list 1.字符串转列表 2.列表转字符串 二.字符串 str 与字典 dict 1.字符串转字典 2.字典转字符串 三.列表 list 与字典 dict 1.列表 ...

  7. python元组为什么不可变_为什么python字符串和元组是不可变的?

    我不知道为什么字符串和元组是不可变的:使它们不可变的优点和缺点是什么? 除了Python解释器的内部实现,这种设计在编写程序上是否有很好的意义?(例如,如果元组和字符串是可变的,会更容易吗?)如果是这 ...

  8. python二维列表转字典_在Python中字符串、列表、元组、字典之间的相互转换

    一.字符串(str) 字符串转换为列表 使用list()方法 str_1 = "1235" str_2 = 'zhangsan' str_3 = '''lisi''' tuple_ ...

  9. python的字符串、列表、元组、字典、集合

    python数据类型 前言 一.字符串 二.列表 三.元组 四.字典 五.集合 前言 Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tupl ...

最新文章

  1. KMeans聚类并绘制聚类后的决策边界
  2. Ubuntu14.04安装nvidia-docker2
  3. Coursera课程Python for everyone:chapter4
  4. 预训练模型真的越大越好吗?听听他们怎么说
  5. bat判断文件是否存在_BAT面试必问题系列:JVM判断对象是否已死和四种垃圾回收算法总结...
  6. 石墨烯将是下一个万亿级别的产业,投资者该如何提前布局?
  7. Oracle client 使用 .net程序连接 数据库时 出现 8.1.7 的解决办法
  8. Security+ 学习笔记12 安全编码实践
  9. sql用java做界面设计_My Sql作为数据库,java作为应用程序?
  10. 深入理解JVM虚拟机 3.6
  11. ai人工智能使用的软件_MachineRay:使用AI创造抽象艺术
  12. 如何在Win10中运行Win7小游戏 扫雷,蜘蛛纸牌,红心大战,纸牌,空当接龙?
  13. 【Windows】VMware虚拟机安装Windows 10 教程
  14. USACO-Section 3.4 Raucous Rockers (DP)
  15. PHP框架底层源码怎么看,php底层_php框架底层源码怎么看
  16. Windows***与提权技巧汇总
  17. 后场正手移动跳杀球技术图解
  18. dbv数据库乱码_使用DBV进行数据库版本控制
  19. php多张图片制作成视频教程,如何将多张图片转换成视频?快速制作电子相册的方法...
  20. iOS 修改苹果开发者公司账号(Apple ID 更换)

热门文章

  1. 用函数判断一个年份是不是闰年
  2. NLP 中的通用数据增强方法及针对 NER 的变种
  3. 国内IT软件开发人员现状
  4. Linux 学习大全
  5. html css 两张图片重叠放,背景图片叠加问题,大神给指个路_html/css_WEB-ITnose
  6. spring中的Filter使用
  7. 【Apple App】解决苹果开发者网页加载慢问题
  8. Web服务器的配置与管理(4) 配置访问权限和安全
  9. OpenGL超级宝典(第五版)环境配置【转】
  10. MyCCL复合特征码定位系统3.0 build 23 中文绿色版