1.首先来说,对简单的字符串、数字、字符来说,“=” 、copy()、deepcopy()复制之后的地址都是一样的:

复制 _SE_AUDIT_PROCESS_CREATION_INFO 结构 复制的结果是什么_子序列

运行结果为:

1037752004848 1037752004848 1037752004848 1037752004848

2.对于简单的序列来说,以列表为例:

复制 _SE_AUDIT_PROCESS_CREATION_INFO 结构 复制的结果是什么_字符串_02

其运行结果为:

449138478216 449138478216 449138478408 449138578056

结论:对简单的一维列表,copy()和deepcopy()都改变了原列表的地址,如果对c、d的值进行修改不会改变原列表a的值

3.对于复杂的序列执行copy和deepcopy   (重点)

复制 _SE_AUDIT_PROCESS_CREATION_INFO 结构 复制的结果是什么_字符串_03

执行结果为:

426924920136 426924920136 426925019784 426925019720

此时c、d的地址和a还是不一样的

那么,重点来了,再打印一下a、b、c、d中序列[4,5,6] 的地址:

复制 _SE_AUDIT_PROCESS_CREATION_INFO 结构 复制的结果是什么_字符串_04

运行结果为:

399453015176 399453015176 399453015176 399453114888

结果发现copy()而来的c[3]和a[3]的地址是一样的,就是说修改c[3]里面的值,a[3]里面的值也会变,

而deepcopy()而来的d[3]和a[3]的地址是不一样的,修改也相互独立,如:

复制 _SE_AUDIT_PROCESS_CREATION_INFO 结构 复制的结果是什么_python copy deepcopy_05

运行结果为:

[1, 2, 3, [4, 'good', 6]]

[1, 2, 3, [4, 'good', 6]]

[1, 2, 3, [4, 'good', 6]]

[1, 2, 3, [4, 5, 6]]

可以看到修改c[3], a、b、c的值都被修改了,

那么再修改一下d[3]:

复制 _SE_AUDIT_PROCESS_CREATION_INFO 结构 复制的结果是什么_子序列_06

运行结果为:

[1, 2, 3, [4, 5, 6]]

[1, 2, 3, [4, 5, 6]]

[1, 2, 3, [4, 5, 6]]

[1, 2, 3, [4, 'good', 6]]

结论:deepcopy()完全创建一个新的对象,所有修改操作和原对象无关

            copy()也是创建一个新的对象,但是里面对其他序列的引用,还是原对象里的地址

4.最后一个问题,让我不解的是deepcopy()是完全复制一个新的对象和地址,以d=deepcopy(a)为例,复制后 d[3] 序列和 a[3] 序列的地址不同,但为什么d[3]中具体的一个元素的地址就和a[3]中的一样了呢?   

复制 _SE_AUDIT_PROCESS_CREATION_INFO 结构 复制的结果是什么_字符串_07

运行结果为:

711862279088 711862279088 711862279088 711862279088

特意选了一个 -8 元素来看地址,结果还是地址一样,(因为Python中对 -5以上的整数都进行了处理,即 -5以上的数的地址都是相同的)

 

更为神奇的是地址一样了,如果修改d[3][0]的值,是不会修改a[3][0]的值的:

复制 _SE_AUDIT_PROCESS_CREATION_INFO 结构 复制的结果是什么_子序列_08

执行结果:

[1, 2, 3, [-8, 5, 6]]
[1, 2, 3, [-8, 5, 6]]
[1, 2, 3, [-8, 5, 6]]
[1, 2, 3, ['hello', 5, 6]]
563517610928 563517610928 563517610928 563517502776

d[3][0]的地址改变了

 

所以,deepcopy()是复制一个序列以及序列中的所有子序列,copy()只是复制一个序列,而不复制序列中的子序列(引用原来的地址)

 

后续:我想到了python中的另一个实例:Tuple元组是不能修改的,但是却可以修改元组中的列表,不知道这二者是不是同一个道理呢