深拷贝与浅拷贝

python 复制代码
import copy

# 初始化一个包含列表的列表,用于后续的拷贝操作
a = [[6, 6], [8, 8], [9, 9]]

# 使用copy模块的copy方法对a进行浅拷贝,创建b
# 浅拷贝意味着创建新列表,但嵌套的列表仍然共享
b = copy.copy(a)   # 浅拷贝

# 使用copy模块的deepcopy方法对a进行深拷贝,创建c
# 深拷贝意味着完全复制列表及其嵌套的列表,不共享任何部分
c = copy.deepcopy(a) # 深拷贝

# 修改b列表的第一个嵌套列表的第一个元素
# 这将影响到a(因为b是a的浅拷贝),但不会影响到c(因为c是a的深拷贝)
b[0][0] = 1
print("a:", a)
print("b:", b)
print("c:", c)


a: [[1, 6], [8, 8], [9, 9]]
b: [[1, 6], [8, 8], [9, 9]]
c: [[6, 6], [8, 8], [9, 9]]

在Python中,用一个变量给另一个变量赋值,其实就是给当前内存中的对象增加一个"标签"而已。

复制代码
>>> a = [6, 6, 6, 6]
>>> b = a
>>> print(id(a), id(b), sep = '\n')
66668888
66668888

>>> a is b
True(可以看出,其实a和b指向内存中同一个对象。)

浅拷贝是指创建一个新的对象,其内容是原对象中元素的引用(新对象与原对象共享内存中的子对象)。

注:浅拷贝和深拷贝的不同仅仅是对组合对象来说,所谓的组合对象就是包含了其他对象的对象,如列表,类实例等等。而对于数字、字符串以及其他"原子"类型,没有拷贝一说,产生的都是原对象的引用。

常见的浅拷贝有:切片操作、工厂函数、对象的copy()方法,copy模块中的copy函数。

复制代码
>>> a = [6, 8, 9]
>>> b = list(a)
>>> print(id(a), id(b))
4493469248 4493592128    #a和b的地址不同

>>> for x, y in zip(a, b):
...     print(id(x), id(y))
... 
4489786672 4489786672
4489786736 4489786736
4489786768 4489786768
# 但是他们的子对象地址相同

从上面的例子中可以看出,a浅拷贝得到b,a和b指向内存中不同的list对象,但是他们的元素指向相同的int对象,这就是浅拷贝。

深拷贝是指创建一个新的对象,然后递归的拷贝原对象所包含的子对象。深拷贝出来的对象与原对象没有任何关联。

深拷贝只有一种方式:copy模块中的deepcopy函数。

我们接下来用一个包含可变对象的列表来确切地展示浅拷贝和深拷贝的区别:

复制代码
>>> a = [[6, 6], [8, 8], [9, 9]]
>>> b = copy.copy(a)   # 浅拷贝
>>> c = copy.deepcopy(a) # 深拷贝
>>> print(id(a), id(b)) # a和b地址不同
4493780304 4494523680
>>> for x, y in zip(a, b):   # a和b的子对象地址相同
...     print(id(x), id(y))
... 
4493592128 4493592128
4494528592 4494528592
4493779024 4493779024
>>> print(id(a), id(c))   # a和c不同
4493780304 4493469248
>>> for x, y in zip(a, c): # a和c的子对象地址也不同
...     print(id(x), id(y))
... 
4493592128 4493687696
4494528592 4493686336
4493779024 4493684896
相关推荐
格鸰爱童话31 分钟前
向AI学习项目技能(二)
java·人工智能·python·学习
Sagittarius_A*36 分钟前
傅里叶变换:从空域到频域的图像分析【计算机视觉】
图像处理·人工智能·python·opencv·计算机视觉·傅里叶变换·频域滤波
Pyeako43 分钟前
深度学习--循环神经网络原理&局限&与LSTM解决方案
人工智能·python·rnn·深度学习·lstm·循环神经网络·遗忘门
困死,根本不会1 小时前
蓝桥杯python备赛笔记之(八)动态规划(DP)
笔记·python·学习·算法·蓝桥杯·动态规划
weixin199701080161 小时前
货铺头商品详情页前端性能优化实战
java·前端·python
深蓝电商API1 小时前
爬虫监控告警:结合企业微信或钉钉,打造 7×24 小时实时预警系统
爬虫·python·钉钉·企业微信
懷淰メ1 小时前
python3GUI--socket+PyQt5开发局域网微信(含功能、详细介绍、分享)
python·学习·gui·大学生·pyqt5·微信界面
risc1234561 小时前
channel.read(dest, channelPosition) 的读取大小限制
开发语言·python
xixixi777772 小时前
拥抱AI大模型时代:开发者如何利用智能编程工具提升效率
人工智能·python·ai·大模型·aigc·代码
李昊哲小课2 小时前
Python 高级数据结构
开发语言·数据结构·python