python浅拷贝和深度拷贝

通过代码和结果来理解浅拷贝和深度拷贝,先来看看python中有那些常见的浅拷贝方法:

1.使用数据类型本身的构造器:

l1 = [1,2,3]
l2 = list(l1)

l1 == l2 #True
l1 is l2 #False

#l2就是l1的浅拷贝,set、dict与上面的浅拷贝一致


t1 = (1,2,3)
t2 = tuple(t1)

t1 == t2 #True
t1 is t2 #True

#由于tuple不可变,tuple返回一个指向相同元组的引用,与list、set、dict不一样

2.通过切片操作符‘:’完成浅拷贝:

l1 = [1, 2, 3]
l2 = l1[:]

l1 == l2 #True

l1 is l2 #False

3.python中提供的函数copy.copy(),适用于任何数据类型:

import copy
l1 = [1, 2, 3]
l2 = copy.copy(l1)

l1 == l2 #True
l1 is l2 #False

浅拷贝,是指重新分配一块内存,创建一个新对象,里面的元素是原对象中子对象的引用。如果元素可变(list、set、dict),浅拷贝会带来一些副作用。如果元素不可变(Number、String、Tuple),就没有这些副作用。

l1 = [[1, 2], (30, 40)]
l2 = list(l1)
l1.append(100)
l1[0].append(3)

l1
[[1, 2, 3], (30, 40), 100]

l2
[[1, 2, 3], (30, 40)]

l1[1] += (50, 60)
l1
[[1, 2, 3], (
### Python拷贝浅拷贝区别Python 中,深拷贝(Deep Copy)浅拷贝(Shallow Copy)是用于复制对象的重要机制。它们之间的核心差异在于新对象与其副本之间共享的内容以及修改行为的影响范围。 #### 1. 浅拷贝(Shallow Copy) 浅拷贝创建一个新的复合对象,但不会递归地复制内部的对象。这意味着原始对象中的子对象仍然会被引用而非被克隆[^2]。因此,在修改原始对象的可变子对象时,这种变化也会反映在其浅拷贝中。 ```python import copy list1 = [1, 2, [3, 4]] shallow_list1 = copy.copy(list1) # 修改原列表中的嵌套列表 list1[2][0] = 'Modified' print("Original List:", list1) # 输出: Original List: [1, 2, ['Modified', 4]] print("Shallow Copied List:", shallow_list1) # 输出: Shallow Copied List: [1, 2, ['Modified', 4]] ``` 此示例表明,尽管顶层列表本身未受影响,但其中的嵌套列表已被更改,因为两者都指向同一个内存地址[^3]。 #### 2. 深拷贝(Deep Copy) 相比之下,深拷贝不仅复制父级容器,还会递归地复制所有的子对象,从而确保完全独立的新实例[^2]。即使修改了源对象或其任何部分,也不会影响到已经完成的深层副本。 ```python deep_list1 = copy.deepcopy(list1) # 再次尝试修改原列表中的嵌套列表 list1[2][1] = 'Again Modified' print("Original List after modification:", list1) # 输出: Original List after modification: [1, 2, ['Modified', 'Again Modified']] print("Deep Copied List remains unchanged:", deep_list1) # 输出: Deep Copied List remains unchanged: [1, 2, ['Modified', 4]] ``` 这里可以看到,无论怎么调整初始数据结构及其组件,都不会波及深度复制后的版本[^3]。 #### 3. "=" 运算符的行为 值得注意的是,“=” 并不执行任何形式的实际复制操作;相反,它只是让两个名称共同指代同一块存储区域内的相同实体。所以一旦某个地方发生了更新,则另一处自然同步呈现相应变动[^4]。 ```python a = [1, 2, 3] b = a b.append(4) print("List A with '=' assignment:", a) # 输出: List A with '=' assignment: [1, 2, 3, 4] print("List B which shares reference:", b) # 输出: List B which shares reference: [1, 2, 3, 4] ``` --- ### 总结对比表格 | 特性 | "=" | 浅拷贝 | 深拷贝 | |---------------------|----------------------|----------------------------|-----------------------------| | **作用目标** | 单纯绑定 | 新建一层外部包裹 | 完全分离整个树形结构 | | **性能消耗** | 极低 | 较高 | 高 | | **适用场景** | 不需改变原有状态 | 数据层间存在关联关系时使用 | 彻底隔离互不影响 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值