Python学习之浅拷贝与深拷贝

1. 浅拷贝

浅拷贝只复制父对象,其内部的子对象不复制。可通过copy.copy实现。

2. 深拷贝

深拷贝不仅复制父对象,还复制子对象,相当于重新生成了一个一模一样的对象。

3. 区别

import copy

a = [1, 2, 3]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
e = list(a)

print("a address: ", id(a))
print("b address: ", id(b))
print("c address: ", id(c))
print("d address: ", id(d))
print("e address: ", id(e))

 

结果:

我们可以看到b的地址和a一样,这是因为b仅仅是a的引用的原因

c,d,e分别对应浅拷贝,深拷贝,浅拷贝

再看另一个例子:

import copy

a = [1, 2, 3]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
e = list(a)

a.append(4)
print("a: ", a)
print("b: ", b)
print("c: ", c)
print("d: ", d)
print("e: ", e)

 

结果:

在这里我们可以看到,a变,b跟着变了,而深拷贝和浅拷贝都没有发生变化,这是因为数字是不可变类型。

常见的不可变类型有:

- 数字

- 字符串

- 元组

第三个例子:

import copy

a = [[1, 2], 1, 2, 3]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
e = list(a)

a[0].append(3)
print("a: ", a)
print("b: ", b)
print("c: ", c)
print("d: ", d)
print("e: ", e)

结果:

这里我们可以看到仅深拷贝没有发生变化,这是因为深拷贝不仅拷贝了父对象即列表a,还拷贝了子对象即a中的[1, 2]。列表是可变对象,所以浅拷贝都随着a的变化而变化了。

可变类型:
- 列表
- 字典

顺便说一下可变与不可变类型:

可变类型不论值相不相同地址都不同。

不可变对象值相同则地址相同。

参考:

https://www.cnblogs.com/alan-babyblog/p/5177597.html

https://www.cnblogs.com/blackmatrix/p/5614086.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值