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

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

开发者学堂课程【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. 总结

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

相关文章
|
3天前
1-4 数据类型
1-4 数据类型
13 0
|
7月前
|
存储 程序员 C语言
C 数据类型
C 数据类型。
31 0
|
3天前
|
SQL JSON 关系型数据库
12. 数据类型
12. 数据类型
|
3天前
|
存储
C数据类型
C数据类型。
14 1
|
8月前
初识数据类型
初识数据类型
20 0
|
10月前
|
C#
【C#视频】数据类型
【C#视频】数据类型
|
9月前
|
存储
数据类型
数据类型
26 0
|
11月前
|
编译器 C语言 C++
C++——数据类型的比较
C++——数据类型的比较
|
Java C语言
|
编译器 C语言
C语言知识-数据类型
C语言知识-基本数据类型
C语言知识-数据类型