
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]})
文字总结:
复制,变量名不一样,但是变量内容指针一样
浅复制,变量内容一层指针一样,当源数据修改时,修改的是一个不可变数据,复制数据内容不变,修改的是可变复合数据,复制数据内容随之改变
深复制,从头到尾完全复制

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

被折叠的 条评论
为什么被折叠?



