Python-1.13 深浅copy

一、浅拷贝

1.源列表、拷贝列表

a = [1, 2]
c = a.copy()

print(a, id(a))
print(c, id(c))

结果:

[1, 2] 2902263288328
[1, 2] 2902263288840

源列表与拷贝列表是两个完全独立的列表

2.修改源列表

a = [1, 2]
c = a.copy()

a[1]='winnie'
print(a, id(a))
print(c, id(c))

结果:

[1, 'winnie'] 2973475885576
[1, 2] 2973475886088

修改源列表,拷贝的列表不会跟着变

3.修改拷贝的列表

a = [1, 2]
c = a.copy()

c[1]='allen'
print(a, id(a))
print(c, id(c))

结果:

[1, 2] 2627341013512
[1, 'allen'] 2627341014024

修改拷贝的列表,原列表也不会改变

不管修改源列表还是拷贝的列表,都不会影响另一个,两个是完全独立的列表

4.修改列表里子对象的元素

  • 源列表、拷贝列表
b = [1, 2, 3, ['b1', 'b2']]
c = b.copy()

print(b, id(b))
print(c, id(c))

结果:

[1, 2, 3, ['b1', 'b2']] 1907107779592
[1, 2, 3, ['b1', 'b2']] 1907109047496
  • 修改源列表里子对象的元素
b = [1, 2, 3, ['b1', 'b2']]
c = b.copy()

b[3].append('cccccc')
print(b, id(b))
print(c, id(c))

结果:

[1, 2, 3, ['b1', 'b2', 'cccccc']] 1758110307336
[1, 2, 3, ['b1', 'b2', 'cccccc']] 1758111575240

改变原列表里子对象的元素,拷贝的列表里的子对象会跟着改变

  • 修改拷贝列表里子对象的元素
b = [1, 2, 3, ['b1', 'b2']]
c = b.copy()

c[3].append('fffffff')
print(b, id(b))
print(c, id(c))

结果:

[1, 2, 3, ['b1', 'b2', 'fffffff']] 2059630957576
[1, 2, 3, ['b1', 'b2', 'fffffff']] 2059632225480

改变拷贝列表里子对象的元素,原列表里的子对象会跟着改变

不管修改源列表里子对象的元素还是拷贝列表里子对象的元素,都会影响另一个,所以才有了深拷贝。

二、深拷贝

1.源列表、拷贝列表

 import copy

a = [1, 2]
c = copy.deepcopy(a)
print(a, id(a))
print(c, id(c))

结果:

[1, 2] 1630247784008
[1, 2] 1630247784264

源列表与拷贝列表是两个完全独立的列表

2.修改源列表

import copy

a = [1, 2]
c = copy.deepcopy(a)

a[1]='winnie'
print(a, id(a))
print(c, id(c))

结果:

[1, 'winnie'] 1159787253384
[1, 2] 1159787261192

修改原列表,拷贝的列表不会跟着变

3.修改拷贝列表

import copy

a = [1, 2]
c = copy.deepcopy(a)

c[1]='allen'
print(a, id(a))
print(c, id(c))

结果:

[1, 2] 2637287394824
[1, 'allen'] 2637287402696

修改拷贝的列表,原列表也不会改变

4.修改列表里子对象的元素

  • 源列表、拷贝列表
import copy

b = [1, 2, 3, ['b1', 'b2']]
c = copy.deepcopy(b)
print(b, id(b))
print(c, id(c))

结果:

[1, 2, 3, ['b1', 'b2']] 1892672154056
[1, 2, 3, ['b1', 'b2']] 1892672155592
  • 修改源列表里子对象的元素
import copy

b = [1, 2, 3, ['b1', 'b2']]
c = copy.deepcopy(b)

b[3].append('cccccc')
print(b, id(b))
print(c, id(c))

结果:

[1, 2, 3, ['b1', 'b2', 'cccccc']] 1704713793416
[1, 2, 3, ['b1', 'b2']] 1704713793480

改变原列表里子对象里的元素,拷贝的列表里子对象不会改变

  • 修改拷贝列表里子对象的元素
import copy

b = [1, 2, 3, ['b1', 'b2']]
c = copy.deepcopy(b)

c[3].append('fffffff')
print(b, id(b))
print(c, id(c))

结果:

[1, 2, 3, ['b1', 'b2']] 1751635472264
[1, 2, 3, ['b1', 'b2', 'fffffff']] 1751635472328

改变拷贝列表里子对象里的元素,原列表里子对象不会改变

总结:

  • 浅拷贝,相当于对象的引用,会创建一个新的对象,源对象和拷贝对象的任何一方改变都不会影响另外一个对象
  • 但是如果存在子对象是可变的,源对象和拷贝对象的任意一方的改变都会影响另外一个对象,
  • 所以有了深copy,就是改变子对象,源对象和拷贝对象的任意一方的改变都不会影响另外一个对象
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值