龙空技术网

python中复制对象:详解浅copy和深copy

Codewar 139

前言:

眼前你们对“python如何粘贴代码”都比较关注,姐妹们都想要分析一些“python如何粘贴代码”的相关资讯。那么小编在网上收集了一些关于“python如何粘贴代码””的相关资讯,希望小伙伴们能喜欢,姐妹们一起来了解一下吧!

在python中关于对象的复制对新手来说经常犯错,因为有些复制操作本来就比较违反直觉的。例如有一个列表a = [[0,1],[2,3]],然后声明了一个新列表b = a。

现在,拥有两个具有相同元素的列表。通过更改list b中的某些元素,一般我们会自然而然的认为这个操作不会对list a 产生影响。

错误。

a = [[0,1],[2,3]]b = ab[1][1] = 100print(a,b) # [[0, 1], [2, 100]] [[0, 1], [2, 100]]print(id(a)==id(b))# True

当使用赋值语句(即)“复制”列表时b = a,在一个列表的元素上所做的任何修改在两个列表中均可见。赋值运算符仅在目标和对象之间创建绑定关系,因此两个列表a和b示例中的对象共享相同的引用id。

此时就引出了今天我们要讨论的问题:如何复制对象?

如果要“复制”对象并仅修改新(或旧)对象中的值而不绑定引用关系,则有两种创建副本的方法:浅copy和深copy。

还是前面代码的例子,我们可以通过b = copy.copy(a)创建a 的浅copy。浅copy副本创建一个新对象,该对象存储原始元素的引用。我们看下面的示例:

import copya = [[0,1],[2,3]]b = copy.copy(a)print(id(a)==id(b))# Falseb[1] = 100print(a,b)# [[0, 1], [2, 3]] [[0, 1], 100]b[0][0] = -999print(a,b)# [[-999, 1], [2, 3]] [[-999, 1], 100]print(id(a[0]) == id(b[0]))# True

在创建嵌套列表的浅copy副本之后,两个列表具有不同的引用id(a) != id(b),符号!=表示“不相等”。但是,它们的元素具有相同的引用,因此id(a[0]) == id(b[0])。

这就意味着更改b中的元素不会影响list a,但是修改b[1]中的元素会影响a[1],所以就很形象啦,copy的很浅。只copy了父对象,忽略了子对象。

简而言之,如果b是a的浅copy,则对b中嵌套对象中的元素所做的任何更改都会显示在a中。

如果要复制嵌套对象而元素之间没有任何绑定,则需要a 的深copy副本b = copy.deepcopy(a)。深copy副本将创建一个新对象,并以递归方式在原始元素中创建嵌套对象的副本。

简而言之深拷贝复制所有内容无论是父对象还是子对象

好了,今天介绍了copy问题,发表这些东西的主要目的就是督促自己,希望大家关注评论指出不足,一起进步。内容我都会写的很细,一个目的就是零基础也能懂,因为自己就是什么基础没有从零学Python的。欢迎交流。

标签: #python如何粘贴代码