Python中copy与deepcopy的区别

本文详细解释了Python中变量作为对象的特性,区分了可变类型(如列表、字典)和不可变类型(如元组、数值、字符串)的拷贝行为。浅拷贝对复杂子对象的影响与深拷贝的区别进行了举例说明。
摘要由CSDN通过智能技术生成

Python中万物皆对象。所有变量都指向一个id(内存地址)。在内存地址中保存着数值。

1.可变类型与不可变类型

import copy
# copy函数的探究
# 对于可变类型(列表、字典)copy为深拷贝,id与原来不同
a = [1,2,3]
b = copy.copy(a)

# 对于不可变类型(元组、数值、字符串),copy为浅拷贝,id与原来一样
c = 12
d = copy.copy(c)
e = copy.deepcopy(c)

print(id(a))
print(id(b))
print(id(c))
print(id(d))
print(id(e))
2056783131200
2056783348224
2056610605712
2056610605712
2056610605712

2.可变类型是否含复杂子对象 

2.1复制的对象中无复杂子对象,即列表中不嵌套列表。

原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。  
原来值的id值与浅复制原来的值不同。 

2.2 若复制的对象中有复杂子对象 

1.当原始值的复杂子对象改变时,浅拷贝的值也会改变.反过来当浅拷贝的对象值中复杂子对象改变时,原始值也会改变
2.当原始值的不是复杂子对象改变时,浅拷贝的值不会改变。

而对于深拷贝来说,上述情况都不会改变拷贝出来对象的值 

c = [1,2,3,[1,2,3]]
d = copy.copy(c)
e = copy.deepcopy(c)
c[3].append(4)
c.append(4)
d[3].append(5)
print(c)
print(d)
print(e)
[1, 2, 3, [1, 2, 3, 4, 5], 4]
[1, 2, 3, [1, 2, 3, 4, 5]]
[1, 2, 3, [1, 2, 3]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值