最详细并且直观理解Python中的可变数据类型和不可变数据类型

本文详细介绍了Python中的可变和不可变数据类型,包括Number、String、List、Tuple、Set和Dictionary等。通过实例解析了可变数据类型(如List和Dictionary)在值改变时内存地址不变,而不可变数据类型(如Number和String)在值改变时会创建新内存地址。此外,还通过内存地址的概念帮助理解这一特性,并提供了示例代码进行演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Python有哪些数据类型

Python3 中有六个标准的数据类型:
1、Number(数字)
2、String(字符串)
3、List(列表)
4、Tuple(元组)
5、Set(集合)
6、Dictionary(字典)

2.哪些数据类型是可变的,哪些是不可变的

Python3 的六个标准数据类型中:

不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

3.怎么理解可变和不可变

看了上面的分类你会很懵,是的,博主第一次接触也是懵的(内心:????,为什么数字类型和字符串类型是不可变的)
懵逼的我们理解的:

x = 1
print(x)#此处输出结果为1
x = 2
print(x)#此处输出结果为2

所以单纯的想法是:这不就变了吗???(还理直气壮)
于是我们打算去搜索关于Python可变类型和不可变类型,会看到这样的解释:
不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。

可变数据类型 :当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型。
对于之前接触过其他编程语言的人看完后可能已经大概能理解了,心中茅塞顿开。但是对于真正的编程小白来说可能就更无法理解了(小白内心:????什么又是内存地址)

4.解释什么内存地址与数据之间的关系

每一个数据都存放在计算机内存中,系统想调用该数据,就会自动找到存放该数据的内存,或者将新的数据写入到一块新的内存中保存。也就是说每一个数据都对应着它自己唯一的内存空间,例如虽然世界上有与你同名的人,但你们生活的家不在同一个地方,别人想找到你,可以通过你家庭地址找到你。

5.继续理解可变数据与不可变数据

大概了解了内存地址与数据之间的关系后,我们进一步说明可变数据与不可变数据。按照前所述:可变数据类型 :当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型。
加上对于内存地址与数据关系的理解再来看这句话,我们以列表类型为例可以理解为:

list = ["爸爸","妈妈","张三"]  # 一个家庭(在一个内存块新建一个列表数据类型,类型值为["爸爸","妈妈","张三"])
print("张三家的地址(内存地址)为:" , id(list))  # 查看他家的地址(内存地址)id(变量)函数用于查看该变量的内存地址
list[2] = "张五"  # 他爸觉得他名字不好听,想改名字叫王五了
print("张五家的地址(内存地址)为:" , id(list))  # 继续查看他家的地址

得到结果如下:
在这里插入图片描述
会发现两个地址一样,也就是说名字(变量值)改变,家庭地址(内存地址)不变,这样的就叫做可变数据类型,你可以通俗理解叫值变地址不变类型(方便理解)
同样方法以元组类型为例来理解不可变数据类型

tuple = ("爸爸","妈妈","张三")# 一个家庭(在一个内存块新建一个元组数据类型,类型值为("爸爸","妈妈","张三"))
print("张三家的地址(内存地址)为:", id(tuple))  # 查看他家的地址(内存地址)id(变量)函数用于查看该变量的内存地址
tuple[2] = "张五"  # 他爸觉得他名字不好听,想改名字叫王五了
print("张五家的地址(内存地址)为:", id(tuple))  # 继续查看他家的地址

运行以上代码将会报错如图所示:
在这里插入图片描述
这里也很直观的说明了元组类型是不允许修改值的,即为不可变类型。
再从我们最初所想的那样来看看,大家对照上面的代码仔细看看哪里不同(上面的是修改的方式,以下是以赋值的方式)

x = 1
print("x = 1时的内存地址为:",id(x))
x = 2
print("x = 2时的内存地址为:",id(x))

list = ["爸爸","妈妈","张三"]             
print("张三家的地址(内存地址)为:" , id(list))  
list = ["爸爸","妈妈","张五"]                     
print("张五家的地址(内存地址)为:" , id(list))  

tuple = ("爸爸","妈妈","张三")                
print("张三家的地址(内存地址)为:", id(tuple))      
tuple = ("爸爸","妈妈","张五")                     
print("张五家的地址(内存地址)为:", id(tuple))      

运行后得到如下结果:
在这里插入图片描述
可以发现每次赋值后内存地址都变了,也就是说赋值的方式来修改变量其实是从内存中另外寻找或者另外新建了一块内存来存取值,来赋给相应的变量。

6.总结

由上所有的结果,相信小白们的疑惑都已经得到相应的解答,最后在此总结,Python中的可变数据类型和不可变数据类型是相对于内存而言的:
可以修改值并且对应的内存地址不变,这就是可变数据类型
不可以修改值,要想改变值,必须重新找到一块内存存储新的值,再将其赋给原变量,也就是要想改变值,必须改变地址。这就是不可变数据类型。

新人初来乍到,不足之处还望大家不吝指出,大家一起学习一起进步,早日成为优秀的程序员!!!!

### Python可变数据类型不可变数据类型的区别 #### 定义 在 Python 中,数据类型依据其对象是否可以在创建后被修改而分为两大类:可变数据类型不可变数据类型。对于不可变数据类型而言,一旦创建了一个实例并赋予初始值,则不允许对其进行任何改变;如果尝试更新该实例的内容,则会生成一个新的对象来存储新的值[^3]。 相反,当处理的是一个可变的数据结构时,在不改变原有对象身份的情况下可以直接对其内部元素进行增删改等操作[^1]。 #### 行为差异展示 为了更直观理解这两种属性之间的不同之处,下面通过具体的代码片段来进行说明: ##### 不可变数据类型示例 (整数, 字符串, 元组) ```python # 整数作为不可变的例子 a = 5 print(id(a)) # 输出 a 的内存地址 b = a + 1 # 创建了新的 int 对象 b=6 而不是修改原来的 a print(id(b)) # 新的对象有不同的 id 地址 # 字符串也是不可变得例子 str_example = "hello" print(f'Original string ID: {id(str_example)}') new_str = str_example.replace('h', 'H') print(f'Modified string ID: {id(new_str)}') # 元组同样属于不可变序列 tuple_example = ('apple', 'banana') try: tuple_example[0] = 'orange' except TypeError as e: print(e) # 尝试修改元组将引发错误 ``` 上述代码展示了如何试图更改这些不可变对象的结果总是会产生全新的对象而不是原位修改现有对象。 ##### 可变数据类型示例 (列表, 字典) ```python # 列表是可以就地修改的容器 list_example = ['red', 'green'] print(f'Initial List ID: {id(list_example)}') list_example.append('blue') # 修改发生在同一个位置上 print(f'After append blue, same object ID?: {id(list_example)==id(list_example)}') # 同样适用于字典这样的映射类型 dict_example = {'name': 'Alice'} print(f'\nInitial Dict ID: {id(dict_example)}') dict_example['age'] = 28 # 添加键值对不会影响原始 dict 的 id print(f'After adding age field, still the same object? :{id(dict_example)==id(dict_example)}') ``` 这里可以看到即使进行了添加或删除元素的操作之后,`list` `dict` 这样的可变对象仍然保持相同的标识号(即它们并没有因为内容的变化而变成另一个不同的实体),这表明实际发生的只是内部状态上的变化而非整个对象本身的替换。 #### 总结 综上所述,区分这两者的关键在于能否直接改变已存在的对象而不必重新分配空间给新版本——前者意味着可以高效地执行某些特定的任务比如频繁更新集合内的成员关系;后者则有助于保护程序逻辑免受意外副作用的影响,并且通常更适合用于表示那些应该在整个生命周期内都固定不变的信息单元[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kivi闭关编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值