python - 浅复制与赋值与深复制

本文深入探讨了Python中对象的深浅复制,通过实例演示了浅复制下复合数据修改的影响,以及深复制如何实现完全独立的对象复制,避免源数据变化带来的副作用。

在这里插入图片描述

In [101]: bb=aa.copy()

In [102]: id(bb)
Out[102]: 2528233626432

In [103]: hex(id(aa))
Out[103]: '0x24ca6152480'

In [104]: hex(id(bb))
Out[104]: '0x24ca6779b40'

In [105]: hex(id(bb[0]))
Out[105]: '0x24ca2104cf0'

In [106]: hex(id(aa[0]))
Out[106]: '0x24ca2104cf0'

In [107]: aa.__sizeof__()
Out[107]: 80

In [108]: bb.__sizeof__()
Out[108]: 56

在这里插入图片描述
aa
在这里插入图片描述
bb

In [109]: aa.append("c")

In [110]: bb.__sizeof__()
Out[110]: 56

In [111]: aa.__sizeof__()
Out[111]: 80

In [112]: aa
Out[112]: ['a', 'bb', 'c']

In [113]: bb[2]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-113-47dab6ead3bd> in <module>
----> 1 bb[2]

IndexError: list index out of range

In [114]: bb[1]
Out[114]: 'bb'

在这里插入图片描述
aa
在这里插入图片描述
bb
在这里插入图片描述
aa的元素指针
在这里插入图片描述
bb的元素指针

In [115]: aa[1]="b"

In [116]: bb[1]
Out[116]: 'bb'

在这里插入图片描述
aa的元素指针变了,因为之前的"bb"是个字符串,是个不可变量,于是aa[1]重新赋值为其他时,元素指针是变得。

等等,我好像搞错了些什么!

===================================================

In [120]: id(aa)
Out[120]: 2528227173504

In [121]: id(b)
Out[121]: 2528227173504

我一时把概念弄混了,原谅我是个菜菜。

===================================================

接上文,浅复制是把所有元素复制过来,那么aa中如果有个复合数据的话,试一下,话说我还没写到列表包含复合数据那里。

In [126]: c=aa.copy()

In [127]: c
Out[127]: ['a', 'b', 'c', ['a', 'b']]

In [131]: aa
Out[131]: ['a', 'b', 'c', ['a', 'b']]

In [132]: aa[3][0]="b"

In [133]: aa
Out[133]: ['a', 'b', 'c', ['b', 'b']]

In [134]: c
Out[134]: ['a', 'b', 'c', ['b', 'b']]

In [135]: aa[1]="bb"

In [136]: aa
Out[136]: ['a', 'bb', 'c', ['b', 'b']]

In [137]: c
Out[137]: ['a', 'b', 'c', ['b', 'b']]

=============================================
第一次的标题弄错了,因为我刚才看到一个函数,deepcopy,这才是真正的深复制。
【Python学习笔记】四、映射(Mapping)

deepcopy()

>>>importcopy
>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})

文字总结:
复制,变量名不一样,但是变量内容指针一样
浅复制,变量内容一层指针一样,当源数据修改时,修改的是一个不可变数据,复制数据内容不变,修改的是可变复合数据,复制数据内容随之改变
深复制,从头到尾完全复制

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值