python的深拷贝与浅拷贝

    技术2022-07-29  85

    给出一个列表

    x=[1,2,3,4]

    进行如下操作

    y=x y[0]=10 print(x) [10,2,3,4]

    用这种方式将x的值赋给y之后,修改y中的元素也会改变x中的元素。 因为y和x都是对同一块内存空间的引用。

    我们可以创造x的一个浅拷贝

    y=x[:] #或者 y=x.copy() y[0]=10 print(x) [1,2,3,4] #此时修改y的值,x不发生改变

    重新定义一个新的列表x

    x=[1,2,[3,4]] y=x.copy() y[0],y[2][0]=10,10 print(y) print(x) [10, 2, [10, 4]] [1, 2, [10, 4]]

    y的元素自然改变了,但是x中的一级元素发生改变,二级元素并没有发生改变。

    浅拷贝,让一级元素有了独立的内存空间,二级元素仍然指向了被拷贝对象的二级元素的内存区域。即浅拷贝只复制了父对象,而不复制内部子对象。

    我们这次导入copy模块

    import copy x=[1,2,[3,4]] y=copy.deepcopy(x) y[0],y[2][0]=10,10 print(y) print(x) [10, 2, [10, 4]] [1, 2, [3, 4]]

    此时一级元素和二级元素都没有发生改变。

    python的默认拷贝方式是浅拷贝。 时间角度:浅拷贝花费时间更少; 空间角度:浅拷贝花费内存更少; 效率角度:浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高。

    Processed: 0.013, SQL: 9