可变数据类型和不可变数据类型 | 学习笔记

简介: 快速学习可变数据类型和不可变数据类型,介绍了可变数据类型和不可变数据类型系统机制, 以及在实际应用过程中如何使用。

开发者学堂课程【Python 入门 2020年版可变数据类型和不可变数据类型】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/639/detail/10299


可变数据类型和不可变数据类型

 

内容介绍:

一、引例

二、可变数据类型和不可变数据类型的区别

 

一、引例

(13-列表的赋值)

1.示例1:

代码

a = 12  //定义变量 a 为12

b = a   //将 a 的值赋给 b

a = 10  //再把 a 的值变为10

print(b)  //输出 b 的结果必然为12

输出结果

12

2.示例2:

相同原理,将 nums1的值赋给 nums2,同样会发生变化。由此引出可变类型和不可变类型的概念,可变类型表示可以修改。

代码

nums1 = [ 100,200,300]

nums2 = nums1  //将nums1的值赋给nums2

nums1[0] = 1    //将nums1的第一个元素变为1

print(nums2)] //输出nums2 的结果

输出结果

[ 1,200,300]

 

二、可变数据类型和不可变数据类型的区别

Python 里的数据都是保存在内存里的,Python 里的数据有分为可变类型和不可变类型。

不可变类型:字符串、数字、元组

可变类型:列表、字典、集合

不可变数据类型,如果修改值,内存地址会发生变化

可变数据类型,如果修改至,内容地址不会发生变化

1.不可变数据类型举例

以上就是出现问题的原因,此时有 a 和 b 两个变量,拿取内存地址的时候,使用内置函数 id 可以获取到一个变量的内存地址,我们分别打印输出修改前和修改后 a 和 b 的值。

通过输出的修改前后的地址可以看出是一串数字。内存的概念好比一个宾馆,如果要开个房间,就要首先到前台去获取房间号,而内存地址就相当于房间号。而显示出的一串数字其实是十六进制数字由十进制输出而成。

代码

a = 12  

b = a  

a = 10

//format(id(a),id(b))表示把 a 的值和 b 的值对应填入{}中

print(‘修改前,a=(},b={}’.format(id(a),id(b)))

print(b)

print(‘修改后,a=(},b={}’.format(id(a),id(b)))

输出结果

修改前, a=140732645208688,b=140732645208688

12

修改后, a=140732645208624,b=140732645208688

如想将十六进制数变的更加美观,可以使用%X。将{}变成%X,同时去掉 format 使用%占位符进行格式化。此时输出前的结果就会发生改变。可以看出,修改前 a 和 b 的地址是一致的。

代码

a = 12  

b = a  

a = 10

//%x 对应输出结果是小写字母,大写的%X 对应输出大写字母

print(‘修改前,a=%X,b=%X’ % (id(a),id(b)))

print(b)

print(‘修改后,a=%X,b=%X’ % (id(a),id(b)))

输出结果

为小写字母 x 时:

修改前,a=7ffedf537270,b=7ffedf537270

12

修改后,a=7ffedf537230,b=7ffedf537270

为大写字母 X 时:

修改前,a=7FFEDF537270,b=7FFEDF537270

12

修改后,a=7FFEDF537230,b=7FFEDF537270

此时内存相当于房子,其中存放了数值12(相当于房间),且 a 和 b 都指向12数值(此房间),同时12所对的房间号即地址为0x7FFEDF537270,而此时执行 a=10的操作时,a 指向的数字12此时为不可变数据类型,不可将12变为10。

所以将 a 指向另一个存放数值10的房间,房间号即地址变为0x7FFEDF537230。(虚线表示 a 修改前指向,实线表示 a 修改后指向)

图片1.png

 

2. 可变数据类型举例

我们在列表中分别打印输出修改前和修改后 nums1和 nums2的地址。通过输出结果可以看出都是同一个地址,没有发生变化。

Tips:如果在控制台中搜索使用 ctrl+f,同时要注意先运行之后在运行结果框进行搜索。

代码

nums1 = [ 100,200,300]

nums2 = nums1  //将 nums1的值赋给 nums2

print('修改前的 nums1=%X, nums2=%X’ % (id(nums1), id(nums2)))

nums1[0] = 1    //将 nums1的第一个元素变为1

print(nums2)] //输出 nums2 的结果

print('修改后的 nums1=%X, nums2=%X’ % (id(nums1), id(nums2)))

输出结果:

修改前的 nums1=1FF247A5208, nums2=1FF247A5208

[1,200,300]

修改后的 nums1=1FF247A5208, nums2=1FF247A5208

此时相当于有一块内存空间,地址为0x1FF247A5208处原来存放的数据为[100,200,300],此时 nums1和 nums2都指向这块数据空间。

而列表是一个可变数据类型,就可以直接修改 nums1中的第一个元素为1。输出结果就变为[1,200,300]。

图片2.png

3. 总结

相当于可变数据类型能够在原来内存地址上直接修改数据,但不可变数据类型只能重新指向另一个地址再存放更改的数据。

相关文章
|
网络协议 Linux
SNAT和DNAT原理及应用
SNAT和DNAT原理及应用
1911 0
SNAT和DNAT原理及应用
|
算法 异构计算 索引
|
网络协议 关系型数据库 MySQL
连接远程mysql数据库失败常见原因及解决办法
1. 没有开启 MySQL 的远程登陆帐号。 1.找到mysql数据库的user表。在user表中新建一条数据,设置User(username)和Host(开放访问MySQL的IP:例如123.118.17.201)以及登录密码。这样就设置了允许访问的用户名和IP地址(若想所有IP都可以访问,则可将Host设置为‘%’,但是这样很危险,不建议)。
8829 0
连接远程mysql数据库失败常见原因及解决办法
|
7月前
|
存储 人工智能 自然语言处理
云上玩转DeepSeek系列之二:PAI+DeepSeek,打造智能问答助手
本文将为您带来“PAI+DeepSeek,30分钟打造支持连网搜索+私有知识库的智能应用”最佳实践,大模型能力、联网能力再加持 RAG 方案,实现 DeepSeek 系列模型与现有业务的高效融合。
|
负载均衡 算法 Linux
快速掌握keepalived
快速掌握keepalived
364 0
|
存储 安全 区块链
云上数字资产管理:解锁数字经济新蓝海,护航企业价值增长
生态化建设:数字资产管理将不再局限于企业内部,而是逐步向生态化方向发展。企业将与产业链上下游伙伴、第三方服务机构等共同构建数字资产管理生态体系,实现资源的共享和价值的共创。 结语 云上数字资产管理作为数字经济时代的重要产物,正以其独特的优势和价值引领着企业资产管理的变革和发展。面对未来的机遇和挑战,企业需要不断加强技术创新和人才培养
657 0
|
安全 测试技术 Swift
Llama 3开源,魔搭社区手把手带你推理,部署,微调和评估
Meta发布了 Meta Llama 3系列,是LLama系列开源大型语言模型的下一代。在接下来的几个月,Meta预计将推出新功能、更长的上下文窗口、额外的模型大小和增强的性能,并会分享 Llama 3 研究论文。
Llama 3开源,魔搭社区手把手带你推理,部署,微调和评估
|
测试技术 数据库 UED
【白盒测试】单元测试的理论基础及用例设计技术(6种)详解
【白盒测试】单元测试的理论基础及用例设计技术(6种)详解
1036 1
|
安全
全面人机协同系统的理论框架
【1月更文挑战第20天】全面人机协同系统的理论框架
981 1
全面人机协同系统的理论框架