Python深浅拷贝详细深入

赋值

赋值是对内存地址的引用

浅拷贝

浅拷贝就是额外在内存中创建第一层数据,注意第一层的意思是最外层的数据,然后第一层的数据仍然指向原来内存中的数据

浅拷贝是新建了子对象,仅仅拷贝了第一层的数据,但是内部的数据还是引用

最外层的数据

改变原始数据的最外层,深浅拷贝都已经拷贝了这一层,不会首影响,只有原来的数据改变

i1={'k3': ['hijack', 678], 'k2': 123, 'k1': 'hi'}
import copy
i2=copy.copy(i1)
i3=copy.deepcopy(i1)

>>> i1["k4"]="add_data_test"
>>> i2
{'k3': ['hijack', 678], 'k2': 123, 'k1': 'hi'}
>>> i3
{'k3': ['hijack', 678], 'k2': 123, 'k1': 'hi'}
>>> i1
{'k3': ['hijack', 678], 'k2': 123, 'k1': 'hi', 'k4': 'add_data_test'}

改变内层数据

浅拷贝仅仅没有涉及到内层的数据,会受影响


>>> i1["k3"].append("k3_test")
>>> i1
{'k3': ['hijack', 678, 'k3_test'], 'k2': 123, 'k1': 'hi', 'k4': 'add_data_test'}
>>> i2
{'k3': ['hijack', 678, 'k3_test'], 'k2': 123, 'k1': 'hi'}
>>> i3
{'k3': ['hijack', 678], 'k2': 123, 'k1': 'hi'}
>>>

深拷贝

深拷贝是创建完全新的内存地址,全部的都是新的

总结

copy.copy()得到的是新的对象,但是数据还是引用。要得到一个完全一样的对象,用copy.deepcopy()

面试题

import copy
a = [1,2,3,[4,5,],6]
b = a # b是对a的引用
c = copy.copy(a) # 浅拷贝
d = copy.deepcopy(a) # 深拷贝
b.append(10)
c[3].append(11)
d[3].append(12)

print(a)  # [1,2,3,[4,5,11],6,10]  # 改变了原始数据
print(b)  # [1,2,3,[4,5,11],6,10]  # 改变了原始数据
print(c)  # [1,2,3,[4,5,11],6,]    # 内层的数据是引用
print(d)  # [1,2,3,[4,5,12],6,]    # 新的对象

https://www.52pojie.cn/thread-616677-1-1.html

posted @   hzxPeter  阅读(107)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示