python 拷贝 深拷贝 浅拷贝 赋值
2017-11-14 10:24
169 查看
t = [1,["a","b"]] t_bak = t t_cop = copy.copy(t) t_deep = copy.deepcopy(t)
print("id(t)--- "+str(id(t))+" id(t[1]) " +str(id(t[1])) +" id(t[1][1] 也就是 内部列表中的第二个元素"+str(id(t[1][1]))) print("id(t_bak)--- "+str(id(t_bak))+" id(t_bak[1]) " +str(id(t_bak[1])) +" id(t_bak[1][1] 也就是 内部列表中的第二个元素"+str(id(t_bak[1][1]))) print("id(t_copy)--- "+str(id(t_cop))+" id(t_cop[1]) " +str(id(t_cop[1])) +" id(t_cop[1][1] 也就是 内部列表中的第二个元素"+str(id(t_cop[1][1]))) print("id(t_deep)--- "+str(id(t_deep))+" id(t_deep[1]) " +str(id(t_deep[1])) +" id(t_deep[1][1] 也就是 内部列表中的第二个元素"+str(id(t_deep[1][1])))
id(t)--- 140706556438648 id(t[1]) 140706556410336 id(t[1][1] 也就是 内部列表中的第二个元素140706557474336 id(t_bak)--- 140706556438648 id(t_bak[1]) 140706556410336 id(t_bak[1][1] 也就是 内部列表中的第二个元素140706557474336 id(t_copy)--- 140706534860560 id(t_cop[1]) 140706556410336 id(t_cop[1][1] 也就是 内部列表中的第二个元素140706557474336 id(t_deep)--- 140706556438576 id(t_deep[1]) 140706556439656 id(t_deep[1][1] 也就是 内部列表中的第二个元素140706557474336
可以看到,
t和
t_bak这种直接赋值的操作,其实指向的是同一个对象,无论是第一层,还是内部嵌套的元素
而
t和
t_cop这种
copy操作,第一层的
id已经不一样了,说明他们创建了新的对象,但是内部嵌套的元素还是一致的,说明给他们内部嵌套指向的是同一个对象。
再说
t和
t_deep这种
deepcopy深拷贝操作,发现,第一层已经不一样了,说明创建了新的对象,但是内部嵌套的元素还是一样的
修改t_bak(1)
t_bak.append("3")
print(t) #[1, ['a', 'b'], '3']
print(t_bak)#[1, ['a', 'b'], '3']
print(t_cop)#[1, ['a', 'b']]
print(t_deep)#[1, ['a', 'b']]
print("id(t)--- "+str(id(t))+" id(t[1]) " +str(id(t[1])) +" id(t[1][1] 也就是 内部列表中的第二个元素"+str(id(t[1][1]))) print("id(t_bak)--- "+str(id(t_bak))+" id(t_bak[1]) " +str(id(t_bak[1])) +" id(t_bak[1][1] 也就是 内部列表中的第二个元素"+str(id(t_bak[1][1]))) print("id(t_copy)--- "+str(id(t_cop))+" id(t_cop[1]) " +str(id(t_cop[1])) +" id(t_cop[1][1] 也就是 内部列表中的第二个元素"+str(id(t_cop[1][1]))) print("id(t_deep)--- "+str(id(t_deep))+" id(t_deep[1]) " +str(id(t_deep[1])) +" id(t_deep[1][1] 也就是 内部列表中的第二个元素"+str(id(t_deep[1][1])))
id(t)--- 139789718802088 id(t[1]) 139789718801728 id(t[1][1] 也就是 内部列表中的第二个元素139789719836192 id(t_bak)--- 139789718802088 id(t_bak[1]) 139789718801728 id(t_bak[1][1] 也就是 内部列表中的第二个元素139789719836192 id(t_copy)--- 139789697222416 id(t_cop[1]) 139789718801728 id(t_cop[1][1] 也就是 内部列表中的第二个元素139789719836192 id(t_deep)--- 139789718802232 id(t_deep[1]) 139789718802376 id(t_deep[1][1] 也就是 内部列表中的第二个元素139789719836192
修改 t_bak(2)
t_bak[1][1]='c' print(t) #[1, ['a', 'c'],] print(t_bak)#[1, ['a', 'c']] print(t_cop)#[1, ['a', 'c']] print(t_deep)#[1, ['a', 'b']] id(t)--- 140085180813112 id(t[1]) 140085180812968 id(t[1][1] 也就是 内部列表中的第二个元素140085181848632 id(t_bak)--- 140085180813112 id(t_bak[1]) 140085180812968 id(t_bak[1][1] 也就是 内部列表中的第二个元素140085181848632 id(t_copy)--- 140085159233296 id(t_cop[1]) 140085180812968 id(t_cop[1][1] 也就是 内部列表中的第二个元素140085181848632 id(t_deep)--- 140085180813040 id(t_deep[1]) 140085180812536 id(t_deep[1][1] 也就是 内部列表中的第二个元素140085181847072
这也证明了上述:
浅拷贝创建了一个新的对象,但是内部嵌套的元素仍然和原对象引用的是同一个。
深拷贝,无论内外都重新复制了一份
修改 t_cop
t_cop.append(4)
t_cop[1][1] = 'd'
print(t) #[1, ['a', 'd']]
print(t_bak)##[1, ['a', 'd']]
print(t_cop)#[1, ['a', 'd'], 4]
print(t_deep)#[1, ['a', 'b']]
print("id(t)--- "+str(id(t))+" id(t[1]) " +str(id(t[1])) +" id(t[1][1] 也就是 内部列表中的第二个元素"+str(id(t[1][1]))) print("id(t_bak)--- "+str(id(t_bak))+" id(t_bak[1]) " +str(id(t_bak[1])) +" id(t_bak[1][1] 也就是 内部列表中的第二个元素"+str(id(t_bak[1][1]))) print("id(t_copy)--- "+str(id(t_cop))+" id(t_cop[1]) " +str(id(t_cop[1])) +" id(t_cop[1][1] 也就是 内部列表中的第二个元素"+str(id(t_cop[1][1]))) print("id(t_deep)--- "+str(id(t_deep))+" id(t_deep[1]) " +str(id(t_deep[1])) +" id(t_deep[1][1] 也就是 内部列表中的第二个元素"+str(id(t_deep[1][1])))
id(t)--- 140596834620840 id(t[1]) 140596834621920 id(t[1][1] 也就是 内部列表中的第二个元素140596835776312 id(t_bak)--- 140596834620840 id(t_bak[1]) 140596834621920 id(t_bak[1][1] 也就是 内部列表中的第二个元素140596835776312 id(t_copy)--- 140596813072144 id(t_cop[1]) 140596834621920 id(t_cop[1][1] 也就是 内部列表中的第二个元素140596835776312 id(t_deep)--- 140596834620912 id(t_deep[1]) 140596834651312 id(t_deep[1][1] 也就是 内部列表中的第二个元素140596835685920
修改 t_deep
t_deep.append(5)
t_deep[1][1] = 'e'
print(t) #[1, ['a', 'b']]
print(t_bak)#[1, ['a', 'b']]
print(t_cop)#[1, ['a', 'b']]
print(t_deep)#[1, ['a', 'e'], 5]
print("id(t)--- "+str(id(t))+" id(t[1]) " +str(id(t[1])) +" id(t[1][1] 也就是 内部列表中的第二个元素"+str(id(t[1][1]))) print("id(t_bak)--- "+str(id(t_bak))+" id(t_bak[1]) " +str(id(t_bak[1])) +" id(t_bak[1][1] 也就是 内部列表中的第二个元素"+str(id(t_bak[1][1]))) print("id(t_copy)--- "+str(id(t_cop))+" id(t_cop[1]) " +str(id(t_cop[1])) +" id(t_cop[1][1] 也就是 内部列表中的第二个元素"+str(id(t_cop[1][1]))) print("id(t_deep)--- "+str(id(t_deep))+" id(t_deep[1]) " +str(id(t_deep[1])) +" id(t_deep[1][1] 也就是 内部列表中的第二个元素"+str(id(t_deep[1][1])))
id(t)--- 140579373325560 id(t[1]) 140579373295088 id(t[1][1] 也就是 内部列表中的第二个元素140579374360096 id(t_bak)--- 140579373325560 id(t_bak[1]) 140579373295088 id(t_bak[1][1] 也就是 内部列表中的第二个元素140579374360096 id(t_copy)--- 140579351746320 id(t_cop[1]) 140579373295088 id(t_cop[1][1] 也就是 内部列表中的第二个元素140579374360096 id(t_deep)--- 140579373325488 id(t_deep[1]) 140579373326136 id(t_deep[1][1] 也就是 内部列表中的第二个元素140579374451928
相关文章推荐
- python中对象的赋值、浅拷贝和深拷贝
- Python 赋值、浅拷贝、深拷贝的区别?
- Python之赋值与深浅拷贝
- python赋值,浅拷贝及深拷贝
- Python中实现变量赋值传递时的引用和拷贝方法
- Python 赋值与拷贝
- 图解python中赋值、浅拷贝、深拷贝的区别
- python 赋值的时候是引用,如果需要复制则需要注意深拷贝和浅拷贝的区别
- Python 赋值、浅拷贝和深度拷贝
- <Python初学>Python中的变量类型。对赋值、浅拷贝与深拷贝的初步认识。
- Python中的对象赋值、浅拷贝与深拷贝
- Python 中赋值和分片拷贝的区别
- Python随记(四)列表复制 之 直接赋值 浅拷贝 和 深度拷贝的分析
- python 深入理解 赋值、引用、拷贝、作用域
- python中的变量赋值,浅拷贝,深拷贝
- Python中的赋值与拷贝
- 深入理解 python 中的赋值、引用、拷贝、作用域
- python基础(5):深入理解 python 中的赋值、引用、拷贝、作用域
- python的对象赋值、浅拷贝和深拷贝
- Python中的赋值、浅拷贝、深拷贝的区别?