【python】列表复制

      我们经常需要根据已有列表来创建全新的列表,下面来介绍列表复制的工作原理。

<1>原理

       要复制列表,首先需要创建一个包含整个列表的切片,方法是同时省略起始和终止索引([:]),即让python创建一个始于第一个元素,终止于最后一个元素的切片,便可复制整个切片。

例:将‘myFoods’复制给‘friendFoods’。

#Copy List1
myFoods=['rice','water','meat']
friendFoods=myFoods[:]

myFoods.append('ice-cream')
friendFoods.append('fruit')

print('myFoods:')
print(myFoods)
运行结果:
myFoods:
['rice', 'water', 'meat', 'ice-cream']
friendFoods:
['rice', 'water', 'meat', 'fruit']

注意:关键一步为
friendFoods=myFoods[:]

<2>注意

若将
friendFoods=myFoods[:]
改为
friendFoods=myFoods

则整个程序变为:

#Copy List2
myFoods=['rice','water','meat']
friendFoods=myFoods

myFoods.append('ice-cream')
friendFoods.append('fruit')

print('myFoods:')
print(myFoods)
则运行结果为:
myFoods:
['rice', 'water', 'meat', 'ice-cream', 'fruit']
friendFoods:
['rice', 'water', 'meat', 'ice-cream', 'fruit']

      可发现,对myFoods和friendFoods的操作同时增加了二者的列表元素,说明方法二是将myFoods的地址传递给了friendFoods(即关联到了一起),所以改变列表一的值也会改变列表二。而方法一是将myFoods的副本传递给了friendFoods,二者在第一次复制完后,不再相互干扰,干干净净清清爽爽。





### 如何在Python中正确复制列表Python 中,可以通过多种方法来实现列表复制。具体来说,有浅拷贝(shallow copy)和深拷贝(deep copy),两者的区别在于是否递归地复制嵌套对象。 #### 浅拷贝 (Shallow Copy) 浅拷贝会创建一个新的容器,但是该容器中的元素仍然是原对象的引用。如果原列表中有嵌套的对象(如子列表或其他可变数据结构),修改这些嵌套对象会影响浅拷贝后的版本[^1]。 以下是使用 `copy` 模块进行浅拷贝的例子: ```python import copy original_list = [1, 2, [3, 4]] shallow_copy = copy.copy(original_list) original_list[2][0] = 5 print("Original List:", original_list) # 输出: Original List: [1, 2, [5, 4]] print("Shallow Copy:", shallow_copy) # 输出: Shallow Copy: [1, 2, [5, 4]] ``` 可以看到,在修改了 `original_list` 的嵌套列表 `[3, 4]` 后,`shallow_copy` 中对应的嵌套列表也被改变了[^3]。 另一种实现浅拷贝的方法是切片操作或者直接调用列表构造函数: ```python # 使用切片操作 slice_copy = original_list[:] # 或者使用 list 构造器 constructor_copy = list(original_list) ``` 以上两种方式均适用于仅含不可变对象的一维列表,但对于包含可变对象的复杂列表,则可能无法完全隔离两者之间的关联[^2]。 --- #### 深拷贝 (Deep Copy) 深拷贝不仅会创建新的外层容器,还会递归地复制所有内部对象。因此,即使原列表中含有嵌套的可变对象,也不会影响到深拷贝的结果[^1]。 下面是利用 `copy.deepcopy()` 实现深拷贝的示例代码: ```python import copy original_list = [1, 2, [3, 4]] deep_copy = copy.deepcopy(original_list) original_list[2][0] = 5 print("Original List:", original_list) # 输出: Original List: [1, 2, [5, 4]] print("Deep Copy:", deep_copy) # 输出: Deep Copy: [1, 2, [3, 4]] ``` 从上面可以看出,尽管更改了 `original_list` 嵌套列表的内容,但 `deep_copy` 并未受到影响[^3]。 --- ### 总结 - 如果只需要简单地复制一层列表而无需考虑其中的嵌套对象,可以选择 **浅拷贝**。 - 当面对复杂的、含有嵌套可变对象的数据结构时,应采用 **深拷贝** 来确保独立性。 选择合适的复制策略取决于实际需求以及目标数据的具体特性[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值