深拷贝与浅拷贝

1. 浅拷贝

对于python而言,"="仅会传递引用

a = [1, 2, 3]

 

b = a

如创建一个list a ,再把a赋给b,仅会将a创建的list地址指针传递给b,让b指向a的创建的list地址,而不是新创建一个list对象

这时,修改b的值,会造成a中的值也会发生变化

b[0] = 5

因此为了解决可变对象的引用可能会产生的冲突(修改一个,导致另一个不希望改变的变量也改变了),可以使用浅拷贝来避免冲突,浅拷贝的使用方法有两种(只有可变对象才需要copy(只有可变对象才能改变内部的值),也只有可变对象才有copy方法(例如tuple是没有copy方法的))

方法一:变量.copy

a = [1, 2, 3]
b = a.copy()

方法二:使用python自带的copy库

import copy
a = [1, 2, 3]
b = copy.copy(a)

此外,使用切片赋值也等同于浅拷贝

a = [1, 2, 3]
b = a[:]

35a010c3a0ddcef65e2be6ea5ee6763b.png

2. 深拷贝

但是对于可变对象存在嵌套的情况,无论是切片赋值还是copy,都只会复制最外面一层

a = [1, 2, 3, [4, 5, [1, 2, 3]]]

a = [1, 2, 3, [4, 5, [1, 2, 3]]]
b = a.copy()
c = a[:]

这里修改内层元素的值,同样也会改变a对应位置的值

a = [1, 2, 3, [4, 5, [1, 2, 3]]]
b = a.copy()
b[3][0] = 1

当然你可以通过对外层元素重新赋值而改变指针的指向,从而使得b与a无关

a = [1, 2, 3, [4, 5, [1, 2, 3]]]
b = a.copy()
b[3] = [1, 2, 3]

'

但如果你想对a的数据进行完整的拷贝,则只能使用深拷贝即copy中的deepcopy方法,这会生成一个a的副本,并让b指向a的副本,这时a和b就完全无关了

import copy
a = [1, 2, 3, [4, 5, [1, 2, 3]]]
b = copy.deepcopy(a)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值