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

先看一段代码。

复制代码
value1 = 10
value2 = value1
print(value1)
print(value2)
value1 = 30
print(value1)
print(value2)

再看另一段代码。

复制代码
list1 = [1,2,3,4]
list2 = list1
print(list1)
print(list2)
list1.append(5)
print(list1)
print(list2)

第一段代码中,value2的值没有随value1而改。但在第二段代码中,list2的值跟着list1的操作而变化。这是为什么呢?

原因就在:Python的数据类型区分为可变数据类型不可变数据类型

1、不可变数据类型

顾名思义,不能改变的数据类型就称为不可变数据类型。

哪里不能改变呢?

秘密藏在其内存地址里面。

看如下一段代码:

复制代码
value1 = 10
value2 = value1
print(id(value1))
print(id(value2))
value1 = 20
print(id(value1))
print(id(value2))

通过id这个方法,我们可以打印出每个变量在内存中的内存地址。

观察这个内存地址,开始的value1和value2的内存地址都是相同的,但当value1发生更改之后,value1的内存地址发生了变化,而value2的不变。

在Python中规定,内存地址中的值不能发生改变的数据类型,称为:不可变数据类型。若变量的值改变了,就必须重新分配一块新的内存地址,存储新的值。

Python中的不可变数据类型有哪些呢?

整型、浮点型、字符串、布尔值和元组。这几个都是不可变数据类型。

2、可变数据类型

与不可变数据类型相反的数据类型,自然称为可变数据类型。

可变数据类型有:列表、集合和字典。

它的定义跟前者相反。内存地址中的值允许发生改变的数据类型,称为:可变数据类型。即使变量的值变了,那也可不重新分配一块新的内存地址。

看如下的代码:

复制代码
list1 = [1,2,3,4,5]
list2 = list1
print(id(list1),id(list2))
list1.pop()
print(id(list1),id(list2))

当然,我们也可以为可变数据类型重新赋值,这时候内存地址也会发生变化。

复制代码
list1 = [1,2,3,4,5]
list2 = list1
print(id(list1),id(list2))
list1 = [6,7,8]
print(id(list1),id(list2))

因此,可变数据类型只是允许我们在已有的内存地址中修改值,不代表其内存地址永远不变。

3、使用场景

为什么要引入可变数据类型和不可变数据类型呢?

有些场景需要用到这两种数据类型,单一的数据类型无法适应所有的场景。

不可变数据类型:一旦定义了,就不会轻易改变。当某个场景不需要修改元素时,就可以使用其作为定值。

可变数据类型:定义了,可以任意改变。当某个场景需要频繁修改元素的时,就可以使用可变数据类型。

大家可以记住,不需要返回值接收的,可直接修改自身的,都是可变数据类型。

4、复制

分为浅复制和深复制。

浅复制:copy,只能复制第一层,再深就不行了。

深复制:全复制,不管层数多深。

浅复制示例:

复制代码
import copy
list1 = [1,2,3,4,5,[1,2,3]]
list2 = copy.copy(list1)
print(list1)
print(list2)
list1[0] = 666
list1[5][0] = 666
print(list1)
print(list2)

深复制示例:

复制代码
import copy
list1 = [1,2,3,4,5,[1,2,3]]
list2 = copy.deepcopy(list1)
print(list1)
print(list2)
list1[0] = 666
list1[5][0] = 666
print(list1)
print(list2)
相关推荐
大志说编程3 分钟前
LangChain框架入门17: 手把手教你创建LLM工具
python·langchain·ai编程
R-G-B31 分钟前
【P38 6】OpenCV Python——图片的运算(算术运算、逻辑运算)加法add、subtract减法、乘法multiply、除法divide
人工智能·python·opencv·图片的运算·图片加法add·图片subtract减法·图片乘法multiply
数据智能老司机39 分钟前
MCP 实战——全局视角:为什么 MCP 将成为 AI 的颠覆者
python·llm·mcp
在星空下44 分钟前
Fastapi-Vue3-Admin
前端·python·fastapi
cxyll12341 小时前
从接口自动化测试框架设计到开发(三)主流程封装、返回数据写入excel
前端·python·excel
Kyln.Wu1 小时前
【python实用小脚本-190】Python一键删除PDF任意页:输入页码秒出干净文件——再也不用在线裁剪排队
服务器·python·pdf
九章云极AladdinEdu2 小时前
Scikit-learn通关秘籍:从鸢尾花分类到房价预测
人工智能·python·机器学习·分类·scikit-learn·gpu算力
抠头专注python环境配置2 小时前
Pytorch GPU版本安装保姆级教程
pytorch·python·深度学习·conda
小磊哥er3 小时前
【办公自动化】如何使用Python自动化处理PDF文档?
python
大模型真好玩3 小时前
DeepSeek更新!速览DeepSeek V3.1新特性
人工智能·python·mcp