python中的深浅拷贝

本文介绍了Python中深浅拷贝的概念。深拷贝是对对象所有层次的递归拷贝,浅拷贝是对对象的顶层拷贝。还阐述了深浅拷贝在不同数据类型(可变与不可变)下的区别,以及序列切片属于浅拷贝。最后通过练习题展示了深浅拷贝的实际应用。

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

要想了解深浅拷贝,首先要知道什么是深浅拷贝?

深拷贝是对于一个对象所有层次的拷贝(递归)copy.deepcopy
浅拷贝是对于一个对象的顶层拷贝;通俗的理解是:拷贝了引用,并没有拷贝内容.copy.copy

深浅拷贝都是对源对象的复制,占用不同的内存空间
如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝
序列对象的切片其实是浅拷贝,即只拷贝顶级的对象

要想知道两者的区别,首先要知道什么是可变类型和不可变类型?

不可变类型:整型,长整型,浮点数,复数,布尔,字符串,元组
可变类型:列表,字典。

深浅拷贝有什么区别那?
1、如果用copy.copy、copy.deepcopy对一个全部都是不可变类型的数据进行拷贝,那么它们结果相同,都是引用指向;
2、如果拷贝的是一个拥有不可变类型的数据,即使元组是最顶层,那么deepcopy依然是深拷贝,而copy.copy还是指向

3、基本上只要不是我们自已手动调用的deepcopy方法都是浅拷贝,切片拷贝字典拷贝都是浅拷贝,而有些内置函数可以生成拷贝(list),属于深拷贝:a = list(range(10))
b = list(a)
练习题1

import copy

list1 = [1,2,['a','b'],('c','d')]

list2 = list1

list3 = copy.copy(list1)

list4 = copy.deepcopy(list1)

list1.append(3)

tuple1 = (10,10)

list1[2].append({100})

list1[3] = list1[3] + tuple1

dict1 = {}

dict1['1'] = 1111

list1[2].append(dict1)

print(list1)                     

print(list2)                     

print(list3)                     
print(list4)                     

详解:

#list1=list2,所以list1和list2指向同一个列表,两者内容一样 (1) [1,2,[‘a’,‘b’,{100},{‘1’:1111}],(‘c’,‘d’,10,10)] (2) [1,2,[‘a’,‘b’,{100},{‘1’:1111}],(‘c’,‘d’,10,10)]

#list3=copy.copy(list1),浅拷贝,列表内列表复制的是引用,会随着list1内列表的内容改变而一起改变,元组不可变 (3) [1,2,[‘a’,‘b’,{100},{‘1’:1111}],(‘c’,‘d’)]

#list4=copy.deepcopy(list1),深拷贝,导致list4是独立全新复制的一份独立的内容,不会随着list1的变化而改变 (4) [1,2,[‘a’,‘b’],(‘c’,‘d’)]

练习题2

import copy

a = [11,22,33] 

b = [44,55,66]

c = [a,b]

d = copy.copy(c)

e = copy.deepcopy(c)

a.append(111)

c.append(55)

print(d)

print(e)


详解:

浅拷贝顶层拷贝d = [[11, 22, 33, 111], [44, 55, 66], 55]

深拷贝递归拷贝e = [[11, 22, 33], [44, 55, 66]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值