python深浅拷贝学习

发布时间 2023-11-01 10:13:59作者: 白天不太黑

copy的原文链接(仅供自己学习查看):

python 浅析格式化输出和深浅copy - 战争热诚 - 博客园 (cnblogs.com)

 

    首先我们从切片技术说起。它应用于所有的序列,包括:列表,字符串,元祖。但是切片不能应用于字典,对于字典只能使用D.copy() 和 D.deepcopy()方法。

  下面具体说一下深浅copy,可以应用于序列,也可以应用于字典

 1  import copy
 2 >>> a = [1,['m']]
 3 >>> b = a   # b采用赋值的方式
 4 >>> c = copy.copy(a)  # c采用浅拷贝
 5 >>> d = copy.deepcopy(a) # d采用深拷贝
 6 >>> e = copy.copy(a) # e采用浅拷贝
 7 >>> f = copy.deepcopy(a) # f采用深拷贝
 8 >>> print(a,'\n',b,'\n',c,'\n',d,'\n',e,'\n',f)
 9 [1, ['m']]
10  [1, ['m']]
11  [1, ['m']]
12  [1, ['m']]
13  [1, ['m']]
14  [1, ['m']]  # 无论是赋值,深浅拷贝,可以得到相同的值
15 >>> print(id(a),id(b),id(c),id(d),id(e),id(f))
16 2390627562824 2390627562824 2390627564168 2390627564744 2390627565000 2390627565128
17 # 只有通过赋值得到的b使用了与a同样的地址,深浅拷贝都分配了不同的内存空间,而且每拷贝一次都会得到一个新的空间
18  
19 >>> a.append(2)  # 对父级对象修改,增加一个值
20 >>> print(a,'\n',b,'\n',c,'\n',d,'\n',e,'\n',f)
21 # 从结果看出只有赋值的收到影响
22 [1, ['m'], 2]
23  [1, ['m'], 2]
24  [1, ['m']]
25  [1, ['m']]
26  [1, ['m']]
27  [1, ['m']]
28 >>> a[1].append('n') # 对内部对象进行修改
29 >>> print(a,'\n',b,'\n',c,'\n',d,'\n',e,'\n',f)
30 # 从结果看出赋值的,以及浅拷贝的收到了影响
31 [1, ['m', 'n'], 2]
32  [1, ['m', 'n'], 2]
33  [1, ['m', 'n']]
34  [1, ['m']]
35  [1, ['m', 'n']]
36  [1, ['m']]
37 >>>
 

      原式和赋值进行改动均会对其有影响(一级目录改动,多级目录嵌套改动)

      如果源对象只有一级目录的话,源对象做任何改动,不影响深浅拷贝对象

      如果源对象不止一级目录的话,源对象做任何改动,都要影响浅拷贝,但不影响深拷贝

      序列对象的切片其实是浅拷贝,即只拷贝顶级的对象(可以理解为初始的内容)