一、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 方法,完全拷贝了父对象及其子对象。
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() 方法进行深度拷贝,这样可以拷贝整个对象,包括嵌套的可变对象。
三、练习的代码