对于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)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)