我理解的Python中的 "=" 、copy()和deepcopy()

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

运行结果为:

1037752004848 1037752004848 1037752004848 1037752004848

 

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

其运行结果为:

449138478216 449138478216 449138478408 449138578056

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

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

执行结果为:

426924920136 426924920136 426925019784 426925019720

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

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

运行结果为:

399453015176 399453015176 399453015176 399453114888

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

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

运行结果为:

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

运行结果为:

[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]中的一样了呢?   

运行结果为:

711862279088 711862279088 711862279088 711862279088

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

 

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

执行结果:

[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元组是不能修改的,但是却可以修改元组中的列表,不知道这二者是不是同一个道理呢

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值