【python】list的深拷贝和浅拷贝

list的浅拷贝和深拷贝

参考:https://blog.csdn.net/sxingming/article/details/51912281

浅拷贝

<1> a=b
a=b这个做法只是将b的地址赋值给了a,a和b同时指向一个链表,所以a和b的值永远是一样的

b = [1,2,3,4]
a = b #浅拷贝
print('a:',a) #a=[1, 2, 3, 4]
print('b:',b) #b=[1, 2, 3, 4]

b.append(21)
print('a:',a) #a=[1, 2, 3, 4, 21]
print('b:',b) #b= [1, 2, 3, 4, 21]

if(id(a)==id(b)):
    print('same id')

在这里插入图片描述
在这里插入图片描述
<2>a=b[:] 和copy.copy() 一样都是浅拷贝
为a开辟了新的空间,a和b的id不同了,但每个位置上的id是一样的

import copy

b = [1,2,[3,4]]
a = b[:] #浅拷贝
c = copy.copy(b) #和[:]效果一样

b.append(5)
print('b:',b) #b=[1, 2, [3, 4],5]
print('a:',a) #a=[1, 2, [3, 4]]  #b变a不变
print('c:',c) #a=[1, 2, [3, 4]]  #b变c不变

b[2].append(5)

print('b:',b) #b= [1, 2, [3,4,5],5]
print('a:',a) #a=[1, 2, [3,4,5]] #b变a也变
print('a:',c) #a=[1, 2, [3,4,5]] #b变a也变

print('id a:',id(a))
print('id b:',id(b))  #a和b的id 不一样
print('id c:',id(c))  


print('id a[1]:',id(a[1]))
print('id b[1]:',id(b[1]))  #a和b每个位置上的id是一样的
print('id c[1]:',id(c[1]))  #a和b每个位置上的id是一样的

在这里插入图片描述

可以通过下图理解
在这里插入图片描述
在这里插入图片描述

深拷贝copy.deepcopy()

import copy

b = [1,2,[3,4]]
a = b[:] #浅拷贝
c = copy.deepcopy(b) #深拷贝

b.append(5)
print('b:',b) #b=[1, 2, [3, 4],5]
print('a:',a) #a=[1, 2, [3, 4]]  #b变a不变
print('c:',c) #a=[1, 2, [3, 4]]  #b变c不变

b[2].append(5)

print('b:',b) #b= [1, 2, [3,4,5],5]
print('a:',a) #a=[1, 2, [3,4,5]] #b变a也变
print('c:',c) #a=[1, 2, [3,4,5]] #b变c不变

print('id a:',id(a))
print('id b:',id(b))  #a和b的id 不一样
print('id c:',id(c))

#深拷贝是列表的位置会开辟新位置
print('id a[1]:',id(a[2]))  #4439847208
print('id b[1]:',id(b[2]))  #4439847208
print('id c[1]:',id(c[2]))  #4439849656

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值