如何理解python列表深拷贝和浅拷贝

在Python中,拷贝列表可以分为浅拷贝和深拷贝。理解这两者的区别对编写健壮和高效的代码非常重要。下面是对浅拷贝和深拷贝的详细解释和示例。

浅拷贝

浅拷贝创建一个新的列表对象,但列表中的元素仍然是对原始列表中元素的引用。换句话说,浅拷贝只拷贝了列表的第一层结构,而不递归拷贝内部的嵌套对象。

方法1:使用切片(Slicing)

original_list = [1, 2, [3, 4]]
shallow_copy = original_list[:]

print(shallow_copy)  # 输出: [1, 2, [3, 4]]
print(shallow_copy is original_list)  # 输出: False
print(shallow_copy[2] is original_list[2])  # 输出: True

方法2:使用copy模块的copy函数

import copy

original_list = [1, 2, [3, 4]]
shallow_copy = copy.copy(original_list)

print(shallow_copy)  # 输出: [1, 2, [3, 4]]
print(shallow_copy is original_list)  # 输出: False
print(shallow_copy[2] is original_list[2])  # 输出: True

方法3:使用列表的copy方法(Python 3.3+)

original_list = [1, 2, [3, 4]]
shallow_copy = original_list.copy()

print(shallow_copy)  # 输出: [1, 2, [3, 4]]
print(shallow_copy is original_list)  # 输出: False
print(shallow_copy[2] is original_list[2])  # 输出: True

深拷贝

深拷贝创建一个新的列表对象,并递归拷贝所有嵌套的对象。这样,新的列表及其所有嵌套对象都是独立的副本。

使用copy模块的deepcopy函数

import copy

original_list = [1, 2, [3, 4]]
deep_copy = copy.deepcopy(original_list)

print(deep_copy)  # 输出: [1, 2, [3, 4]]
print(deep_copy is original_list)  # 输出: False
print(deep_copy[2] is original_list[2])  # 输出: False

浅拷贝和深拷贝的区别

以下示例展示了浅拷贝和深拷贝在处理嵌套对象时的区别: 

import copy

original_list = [1, 2, [3, 4]]

# 浅拷贝
shallow_copy = copy.copy(original_list)
shallow_copy[2][0] = 99

print("Original List after shallow copy modification:", original_list)  
# 输出: [1, 2, [99, 4]]

# 深拷贝
deep_copy = copy.deepcopy(original_list)
deep_copy[2][0] = 88

print("Original List after deep copy modification:", original_list)  
# 输出: [1, 2, [99, 4]]

从上面的示例中可以看到,浅拷贝会影响原始列表中的嵌套对象,而深拷贝不会。

总结

  • 浅拷贝(如使用切片、copy模块的copy函数或列表的copy方法)只复制第一层结构,嵌套的对象仍然是对原始对象的引用。
  • 深拷贝(如使用copy模块的deepcopy函数)则递归地复制所有嵌套的对象,创建完全独立的副本。

 确保在需要深拷贝时正确使用deepcopy,以避免意外修改原始数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值