Python中列表的深浅拷贝

本文详细解释了Python中列表的深拷贝与浅拷贝的区别。对于浅拷贝,第一层创建新内存地址,深层仍指向原地址;深拷贝则会为所有层级的数据开辟新的内存空间。

列表的深浅拷贝
在python中的数据类型包括:bool、int、float、str、set、list、tuple、dict等等。我们可以大致将这些数据类型归类为简单数据类型和复杂的数据类型。
简单数据类型: bool、int、float、str。
复杂数据类型:list、tuple、set、dict。
对于简单数据类型变量在内存中保存的形式如下:
在这里插入图片描述

在这里插入图片描述
对于复杂数据类型变量在内存中保存的形式如下:
列表中保存的是数据的内存地址而不是数据本身。
在这里插入图片描述
1、浅拷贝
对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
将lst中保存的内存地址复制出一份来,在这里插入图片描述
lst 添加一个元素4 不影响lst2在这里插入图片描述
2、深拷贝
嵌套的可变数据类型重新开辟一块内存空间。
导入 copy 模块。
Import copy
copy.deepcopy()在这里插入图片描述
简单数据类型: bool、int、float、str。在这里插入图片描述

### Python 列表拷贝与浅拷贝的区别及用法 #### 浅拷贝(Shallow Copy) 浅拷贝创建一个新的复合对象,但不会递归复制嵌套的对象。它仅复制顶层容器的引用,而内部对象仍然共享相同的内存位置。 以下是浅拷贝的一个例子: ```python import copy lst1 = ['a', 'b', ['ab', 'ba']] lst2 = copy.copy(lst1) print("lst1:", lst1) print("lst2:", lst2) print("id(lst1) == id(lst2):", id(lst1) == id(lst2)) # 不同的 ID 表明它们是不同的列表[^1] # 修改外部元素 lst2[0] = "c" print("After modifying external element:") print("lst1:", lst1) print("lst2:", lst2) # 修改嵌套列表 lst2[2][1] = "d" print("After modifying nested list:") print("lst1:", lst1) # 嵌套列表也被修改了 print("lst2:", lst2) ``` 上述代码展示了当修改 `lst2` 的嵌套列表时,`lst1` 中对应的嵌套列表也会被改变,因为两者共享同一个嵌套对象的引用[^2]。 --- #### 深拷贝(Deep Copy) 深拷贝不仅会创建新的顶层容器,还会递归地复制所有嵌套对象。因此,原始对象及其所有的子对象都不会受到影响。 以下是深拷贝的一个例子: ```python import copy lst1 = ['a', 'b', ['ab', 'ba']] lst2 = copy.deepcopy(lst1) print("lst1:", lst1) print("lst2:", lst2) print("id(lst1) == id(lst2):", id(lst1) == id(lst2)) # 不同的 ID 表明它们是不同的列表[^3] # 修改外部元素 lst2[0] = "c" print("After modifying external element:") print("lst1:", lst1) print("lst2:", lst2) # 修改嵌套列表 lst2[2][1] = "d" print("After modifying nested list:") print("lst1:", lst1) # 原始列表未受影响 print("lst2:", lst2) ``` 通过深拷贝,即使修改了 `lst2` 的嵌套列表,也不会影响到 `lst1`,这是因为深拷贝已经为嵌套对象分配了独立的内存空间[^4]。 --- #### 使用场景对比 - **浅拷贝适用场景**:如果数据结构简单或者不需要担心嵌套对象的变化,则可以使用浅拷贝来节省资源。 - **深拷贝适用场景**:对于复杂的、多层嵌套的数据结构,尤其是需要完全隔离原对象与其副本的情况下,应使用深拷贝。 需要注意的是,某些类型的对象无法被拷贝,例如文件、模块等[^5]。 --- 相关问题
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值