开发者学堂课程【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 修改后指向)
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]。
3. 总结
相当于可变数据类型能够在原来内存地址上直接修改数据,但不可变数据类型只能重新指向另一个地址再存放更改的数据。