深复制和浅复制的区别(列表和numpy数组的区别)

本文探讨了Python中的浅复制和深复制概念,分别以列表和字典为例进行解释。浅复制仅复制对象的表面,内层元素如列表仍保留原数据的指针,导致修改新变量可能影响原始数据。而深复制则彻底复制所有层级的对象,创建全新ID,确保原数据不受新变量修改的影响。文章通过实例展示了两者的区别。

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


在python中很多时候需要进行复制的操作,比方说给一个变量赋值为另一个变量,这就是一个复制。
事实上,对于不同类型的对象,有的时候这种复制是深复制,有时候是浅复制。
下面在例子中具体介绍。

1、浅复制

顾名思义,浅复制就是浅浅地复制,只复制了它的表面,没有复制深层次的东西。就像是只复制了她好看的皮囊,没有复制到她独特的灵魂。
举个例子,列表的和字典就是浅复制。

1.1列表

lis = [1,2,3,4]
lis1 = lis[:3]
lis1[1] = 6
print('lis:',lis)
print('lis1:',lis1)
"""
out:
lis: [1, 2, 3, 4]
lis1: [1, 6, 3]
"""

可以发现,更改新变量中的内容,原始数据并没有变化,难道就这样以为它是深复制吗?

下面再来看:

lis = [1,2,3,4,[5,6]]
lis1 = lis[2:]
lis1[2][0] = 6
print('lis:',lis)
print('lis1:',lis1)
'''
out:
lis: [1, 2, 3, 4, [6, 6]]
lis1: [3, 4, [6, 6]]
'''

可以看到,修改新列表,原始数据也跟随变化了。

这是因为,列表的外层确实是复制了原始数据的值,但是内层列表仍然只是复制了原始数据的地址,它在新列表中保存的不是值而是指针。

当然,如果将[5,6]重新赋值为一个数字,或者一个新的列表,那么都改变了指针的指向,仍然不会改变原始数据。

1.2字典

字典和列表是一样的道理,下面举个简单的例子进行说明。

dic = {'name':'jack','age':18}
dic1 = dic.copy()
dic1['name'] = 'rose'
print('dic:',dic)
print('dic1',dic1)
'''
out:
dic: {'name': 'jack', 'age': 18}
dic1 {'name': 'rose', 'age': 18}
'''
dic = {'name':'jack','age':18,'id':{'sid':1,'bid':2}}
dic1 = dic.copy()
print('更改之前的:\ndic:',dic)
dic1['id']['sid'] = 66
print('更改之后的:\ndic:',dic)
print('dic1',dic1)
'''
更改之前的:
dic: {'name': 'jack', 'age': 18, 'id': {'sid': 1, 'bid': 2}}
更改之后的:
dic: {'name': 'jack', 'age': 18, 'id': {'sid': 66, 'bid': 2}}
dic1 {'name': 'jack', 'age': 18, 'id': {'sid': 66, 'bid': 2}}
'''

请读者自行体会。

2、深复制

下面把上面的例子重新展现,只把复制改成深复制。

2.1 列表

lis = [1,2,3,4,[5,6]]
import copy 
lis1 = copy.deepcopy(lis[2:])
lis1[2][0] = 6
print('lis:',lis)
print('lis1:',lis1)
'''
lis: [1, 2, 3, 4, [5, 6]]
lis1: [3, 4, [6, 6]]
'''

区别显然易见。(对比1.1的第二个代码块)

2.2 字典

dic = {'name':'jack','age':18,'id':{'sid':1,'bid':2}}
import copy
dic1 = copy.deepcopy(dic)
print('更改之前的:\ndic:',dic)
dic1['id']['sid'] = 66
print('更改之后的:\ndic:',dic)
print('dic1',dic1)
'''
更改之前的:
dic: {'name': 'jack', 'age': 18, 'id': {'sid': 1, 'bid': 2}}
更改之后的:
dic: {'name': 'jack', 'age': 18, 'id': {'sid': 1, 'bid': 2}}
dic1 {'name': 'jack', 'age': 18, 'id': {'sid': 66, 'bid': 2}}
'''

对比1.2的第二个代码块。

3、总结

  • 浅复制只有外层复制了对象的值,内层是指向了原数据的指针。原变量有可能会跟随新变量变化。

  • 深复制所有层都是复制了对象的值,开辟了新的id,原变量不可能跟随新变量变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值