深拷贝与浅拷贝

深拷贝与浅拷贝,第1张

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[:]

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)

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/730724.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存