Python引用、浅拷贝、深拷贝、可变数据类型与不可变数据类型详细解析

本文详细讲解了Python中可变数据类型与不可变数据类型的区别,通过实例演示了整数和列表的浅拷贝与深拷贝,帮助理解浅拷贝只复制一层而深拷贝复制所有内容。通过代码和结果展示,揭示了如何避免浅拷贝导致的意外修改。
摘要由CSDN通过智能技术生成

目录:

引用:

"="是内存地址的赋值!

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

代码举例:

a=1
b=a
print(id(a))
print(id(b))
a=[1,2,3,4,5]
b=a
print(id(a))
print(id(b))
a=[1,2,3,4]
print(id(a))

结果:

140726028609328
140726028609328
2637243657536
2637243657536
2637243371840

可变数据类型与不可变数据类型

前置知识点:

在这里插入图片描述
在这里插入图片描述

下图详解:

在这里插入图片描述

数据类型分类:

在这里插入图片描述

代码举例:

对于不可变类型:

a=5
print(id(a))
a=6
print(id(a))

结果:
因为整数是不可变类型,所以当a的值改变后,a所指向的地址也发生了改变

140726028609456
140726028609488

对于可变数据类型(以列表为例)

a=[1,2,3,4,5,6]
print(id(a))
#将数字7加入列表
a.append(7)
print(id(a))

结果:
因为列表是可变数据类型,所以对列表进行操作后,a的指向也不会发生变化

2637243575424
2637243575424

浅拷贝

浅拷贝只拷贝父对象(一层),不会拷贝对象的内部的可变子对象(多层);

代码举例

a=[1,2,3,4,5]
b=a.copy()
print(b)
print(id(a),id(b))

结果:
浅拷贝只copy第一层,copy后的id不等于被copy数据的id

[1, 2, 3, 4, 5]
2637260084544 2637269459968

易错点:

a=[1,[1,2,3],2]
b=a.copy()
print(b)
#此时改变a的值
a[1][1]=6
print(a)
print(b)

结果:
b先浅拷贝a,当我们修改a列表里面嵌套的列表时会发现,b的值也叫修改了
这是因为,浅拷贝只能拷贝一层a[1]位置(嵌套列表)存放的是嵌套列表的引用,浅拷贝因为copy的是第一层,所以copy到嵌套列表时copy的不是具体的值,而是地址,所以当a里面的嵌套列表的值发生改变时,b的值也会发生改变。

[1, [1, 2, 3], 2]
[1, [1, 6, 3], 2]
[1, [1, 6, 3], 2]

深拷贝

深拷贝就是不管数据结构多么复杂,只要遇到可能发生改变的数据类型,就重新开辟一块内存空间把内容复制下来,直到最后一层.

深拷贝只能有copy模板实现

代码示例:

import copy
a=[1,[1,2,3],2]
b=copy.deepcopy(a)
a[1][1]=6
print(a)
print(b)

结果:
我们会发现,修改a嵌套列表里面的值,b嵌套列表的值并没有改变,因为是深copy,copy的是内容,不涉及引用,所以修改a的值,b的值并不会发生变化。

[1, [1, 6, 3], 2]
[1, [1, 2, 3], 2]

总结:

深浅拷贝图示如下:

在这里插入图片描述
可以登录下方网站进行代码动态演示:
https://pythontutor.com/
动态演示python代码的网站

结束,谢谢观看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值