对python中浅拷贝与深拷贝的思考

对于python中列表的拷贝:

1.浅拷贝: 将原对象或原列表的引用直接赋给新对象、新列表,新对象、列表只是原对象的一个引用。

2.深拷贝: 创建一个新的对象或列表,将原对象的各项属性的“值”(列表的所有元素)拷贝过来,是“值”而不是“引用”。

对于浅拷贝的结果如下:

arr = [1, 4, 5 ,2 ,4, 1]

#copy函数拷贝
arr1 = arr.copy()
print(arr1)
## [1, 4, 5 ,2 ,4, 1]

#列表切片拷贝
arr2 = arr[:]
print(arr2)
## [1, 4, 5 ,2 ,4, 1]

此时并未看出拷贝的问题所在

(首先 不可用arr1 = arr进行简单复制,该操作仅仅是简单的让arr1和arr指向了同一个列表,而非拷贝arr的元素)

arr = [1, 4, 5 ,2 ,4, 1]

#copy函数拷贝(用切片结果也是如此)
arr1 = arr.copy()
arr[1] = 0
print(arr1)
## [1, 4, 5 ,2 ,4, 1]

 然而

arr = [1, 4, 5 ,2 ,4, 1]

arr2 = arr
arr[1] = 0
print(arr2)
## [1, 0, 5, 2, 4, 1]

以上足以证明arr1 = arr并非直接拷贝,但是用copy()和切片就是对其进行了元素的拷贝吗?不妨将该列表拓展到二维。

arr = [[1,2,3], [4,5,6], [7,8,9]]

#列表copy拷贝
arr2 = arr.copy()
arr[1][1] = 0
print(arr2)
## [[1, 2, 3], [4, 0, 6], [7, 8, 9]]

发现也并非直接拷贝,浅拷贝只是拷贝了外层的对象,若包含嵌套对象的话,拷贝的也只是其引用。而深拷贝就可以解决如下问题。

import copy

arr = [[1,2,3], [4,5,6], [7,8,9]]

#使用deepcopy函数进行深拷贝
arr1 = copy.deepcopy(arr)
arr[1][1] = 0
print(arr1)
## [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值