【学习笔记】python仅拷贝list的值,引出浅拷贝与深拷贝

2023-12-13 05:34:59

一、python 仅拷贝list的值(来源于gpt)
在 Python 中,可以使用切片或 copy() 方法来仅拷贝列表的值。

1、使用切片
a = [1, 2, 3, 4, 5]
b = a[:] # 通过切片来拷贝 a 的值
在上面的代码中,我们使用切片来拷贝列表 a 的值,生成了一个新的列表 b。此时,修改 b 中的元素不会影响到 a 中的元素。

2、使用 copy() 方法
a = [1, 2, 3, 4, 5]
b = a.copy() # 通过 copy() 方法来拷贝 a 的值
在上面的代码中,我们使用列表的 copy() 方法来拷贝列表 a 的值,生成了一个新的列表 b。此时,修改 b 中的元素不会影响到 a 中的元素。

需要注意的是,如果列表中的元素是可变对象(如列表、字典等),则使用切片或 copy() 方法仅拷贝了对象的引用,而不是对象本身。这意味着,如果修改了拷贝后的列表中的可变对象,原列表中对应的元素也会发生改变。

如果要深度拷贝一个列表,可以使用 copy.deepcopy() 方法,示例如下:
import copy

a = [[1, 2], [3, 4]]
b = copy.deepcopy(a) # 深度拷贝 a 的值
b[0][0] = 0 # 修改 b 中的元素
print(a) # 输出:[[1, 2], [3, 4]]
print(b) # 输出:[[0, 2], [3, 4]]
在上面的代码中,我们使用 copy.deepcopy() 方法来深度拷贝列表 a 的值,生成了一个新的列表 b。此时,修改 b 中的元素不会影响到 a 中的元素。

二、浅拷贝与深拷贝

直接赋值:其实就是对象的引用(别名)。

浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html

在这里插入图片描述
c的结果为什么不等于a:
在上面的代码中,c = copy.copy(a) 是浅拷贝,它只会拷贝 a 的一层对象,而不会拷贝 a 中嵌套的可变对象(如列表 [‘a’, ‘b’])。因此,当修改 a 中嵌套的可变对象时,c 中对应的元素也会发生变化。

具体来说,在修改 a 中的 [‘a’, ‘b’] 数组对象后,c 中对应的元素也发生了变化,因为 c 和 a 中都引用了同一个 [‘a’, ‘b’] 数组对象。而 b 和 a 相等,因为 b 和 a 指向了同一个对象。

如果想要避免这种情况,可以使用 copy.deepcopy() 方法进行深度拷贝,这样可以拷贝整个对象,包括嵌套的可变对象。

三、练习的代码
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

文章来源:https://blog.csdn.net/woomay/article/details/134871503
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。