【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

在这里插入图片描述

在这里插入图片描述

浅拷贝深拷贝Python中用于复制对象的两种方式。浅拷贝只复制了对象的外层列表,内层列表会跟随原列表进行改变,两者互相影响。而深拷贝则是拷贝了所有的数据,并开辟了一个新的内存地址,原数据和拷贝数据不在同一个地址,两者互不影响。 在Python中,赋值语句总是创建对象的引用,而不是复制对象。因此,赋值操作只是拷贝了对象的引用。而拷贝操作是创建了一个新对象,并将原对象的值复制到新对象中。 浅拷贝可以使用多种方法实现,包括使用数据类型本身的构造器、使用copy.copy()函数、使用':'切片操作符以及直接赋值。 深拷贝则可以使用copy模块的deepcopy函数进行实现。 需要注意的是,浅拷贝只拷贝了外层列表,内层列表仍然是引用原对象的子对象。而深拷贝则递归拷贝了所有的子对象,源对象和拷贝对象的子对象也不相同。 总结来说,浅拷贝只拷贝了对象的外层列表,内层列表会跟随原列表进行改变,两者互相影响。而深拷贝则是拷贝了所有的数据,并开辟了一个新的内存地址,原数据和拷贝数据不在同一个地址,两者互不影响。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python 深拷贝浅拷贝详解](https://blog.csdn.net/qq_40630902/article/details/119278072)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python中的浅拷贝深拷贝](https://blog.csdn.net/qq_52703934/article/details/123167223)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值