Python 基础| Python 直接赋值、深拷贝和浅拷贝

先看这三个词的意思我觉得菜鸟的总结就很好 Python 直接赋值、浅拷贝和深度拷贝 | 菜鸟教程

  • 直接赋值:其实就是对象的引用(别名)。

  • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

有一天我遇到这样一个问题,大概是这样给一个list变成list[dict](就是list的每个值加一个描述字段的key)。

a=['a','b','c','d']
b={}
c=[]
for i in a:
    b["info"]=i
    c.append(b)
print(c)

我们看一下程序的逻辑,for循环a,然后b是一个字典,那么b每次被赋值然后被append到 c这个list里,按照预想 c应该打印出 

[{'info': 'a'}, {'info': 'b'}, {'info': 'c'}, {'info': 'd'}]

但是并没有,运行下面的程序会得到

 [{'info': 'd'}, {'info': 'd'}, {'info': 'd'}, {'info': 'd'}]

这是为什么呢,先说怎么解决这个问题,我们引入拷贝这个概念,把代码改成这样,就得到了我们想要的

a=['a','b','c','d']
b={}
c=[]
for i in a:
    b["info"]=i
    f = b.copy()
    c.append(f)
print(c)

[{'info': 'a'}, {'info': 'b'}, {'info': 'c'}, {'info': 'd'}]

因为XXX.copy()这个函数是浅拷贝,浅拷贝就是重新分配一块内存创建一个新的对象,但里面的元素是原对象中各个子对象的引用

相较于普通的赋值,浅拷贝会将两个变量分别放在不同的内存地址,解决了直接赋值的缺点

但是如果我们这个数据结构不是一层的怎么办呢,那就要用到深拷贝。copy.deepcopy() 

深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联

使用方法:

#直接赋值  
a=1
b=a #它俩内存地址是一样的



#浅拷贝
a={'a':[1,2,3]}
b=a.copy()
#他两地址不一样了 但是[1,2,3]是同一个

#深拷贝
a={'a':[1,2,3]}
b=copy.deepcopy(a)   
#这是两个完全独立的东西了

用图直观的描述三者的区别

直接赋值

浅拷贝

 

深拷贝:

 

 

所以在写python程序的时候,遇到复杂的数据结构,要考虑该用深拷贝还是用等号赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值