Python从入门到精通15天(浅拷贝和深拷贝)

Python对象通过引用传递,浅拷贝仅复制第一层元素,对可变对象的第二层引用会导致拷贝后对象同步变化。深拷贝则递归复制所有对象,创建独立副本,即使原对象改变,拷贝对象不受影响。在多线程或需要独立副本时,会选择深拷贝。
摘要由CSDN通过智能技术生成

浅拷贝和深拷贝

深浅拷贝概述

在Python中,对象是通过引用传递的,这意味如果创建了一个对象,然后将其赋值给另一个变量,那么两个变量将引用同一个对象,即a = [3, 4] b = list(a) b也为[3, 4],这就是所谓的浅拷贝;但有时候我们需要复制一个对象,以便我们能够独立地修改其中一个副本,而不影响原始对象。这时我们的Python就提供了两种方式:浅拷贝和深拷贝。

浅拷贝和深拷贝是指对可变对象对进行复制时所采用的两种不同的方式。深浅拷贝的意义在于编程过程中,根据选择合适的拷贝方式,在避免原始对象被修改的同时,还能避免额外的内存开销。如果需要修改拷贝后的对象而不影响原始对象,则应使用深拷贝。而浅拷贝主要是对第一层数据的值进行拷贝,对第二层数据进行引用,在进行简单的操作时可以使用。

他主要应用于多线程中,如果多线程需要同时操作同一个数据结构,那么为了避免并发访问的冲突,通常会使用深拷贝创建多个完全独立的数据结构,从而使每个线程都可以独立地操作自己地数据结构而不会影响其他线程。如果只需要复制对象地部分属性或方法,那么使用浅拷贝即可。

浅拷贝

在Python中,浅拷贝只是创建一个新的对象,然后将原始对象中的第一层所有元素的复制到新对象中,第二层则是将引用复制到新对象。如果原始对象第二层包含可变对象(列表、字典等),那么拷贝后的对象的第二层也将包含相同的可变对象的引用,因此,如果对原始对象第二层的值进行改变,那么拷贝的对象也会受到同样的改变。如果原始为不可变对象,则原始值不会受到改变。

例举一个列表,并改变值,具体代码如下:

import copy

list1 = [1, 2, 3, 4, 5]

# 使用标准函数库
list2 = copy.copy(list1)

print("拷贝前的list2值", list2)

# 对原始列表的值进行改变
list1[3] = 6

print("改变后的list1值", list1)
print("改变后的list2值", list2)

结果如下:

在这里插入图片描述

例举一个嵌套列表,并改变第二层的值,具体代码展示如下:

import copy

list1 = [1, 2, 3, [4, 5], [6, 7]]

# 内置函数copy
list2 = list1.copy()

# 使用标准函数库
list3 = copy.copy(list1)

print("拷贝前的list2值", list2)
print("拷贝前的list3值", list3)

# 对原始列表的第二层值进行改变
list1[3][1] = 6

print("改变后的list1值", list1)
print("改变后的list2值", list2)    
print("改变后的list3值", list3)

结果如下:

在这里插入图片描述

由此可以得出结论,浅拷贝只拷贝第一层,第二层拷贝的是原始对象的引用,如果原始对象的第二层进行了改变,则相应的拷贝对象的值也会改变。

深拷贝

深拷贝则会递归复制所有地可变对象和不可变对象,从而创建一个完全独立的新对象,并不会拷贝原始对象的引用。这意味着如果拷贝后的对象修改了其中的一个可变对象的值,那么原始对象不会受影响。

改变列表第一层的值,具体代码展示如下:

import copy

list1 = [1, 2, 3, [4, 5], [6, 7]]


list2 = copy.deepcopy(list1)

print("改变前的list2值", list2)

# 对原始对象的第一层进行值的改变
list1[2] = 9

print("改变后的list1值", list1)
print("改变后的list2值", list2)


结果如下:

在这里插入图片描述

改变列表第二层的值,具体代码展示如下:

import copy

list1 = [1, 2, 3, [4, 5], [6, 7]]


list2 = copy.deepcopy(list1)

print("改变前的list2值", list2)

# 对原始对象的第二层进行值的改变
list1[3][1] = 6

print("改变后的list1值", list1)
print("改变后的list2值", list2)

结果如下:

在这里插入图片描述

由此可以得出结论,深拷贝只是复制了值,并没有进行引用,即创建一个完全独立的对象,即使对原始对象的值进行了修改,也不会改变拷贝对象的值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ProgramStack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值