浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来设计,如何实现

在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用

浅拷贝

(1)直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变
(2)copy浅拷贝,没有拷贝子对象,改变子对象会改变原始列表的子对象

from copy import copy
a=[1,2,3,[1,2]]
b=copy(a)
b[3].append(3)
b[0]=2
print(a,b)
#[1, 2, 3, [1, 2, 3]] [2, 2, 3, [1, 2, 3]]

深拷贝

包含对象里面的子对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变,这就是深拷贝

from copy import deepcopy
a=[1,2,3,[1,2]]
b=deepcopy(a)
b[3].append(3)
print(a)
#[1,2,3,[1,2]]

自己实现一个deepcopy,可以考虑用递归,实现对list的deepcopy,这里只考虑的list,但是实际还有tuple,dict,set

def deepcopy(obj):
    mylist = []

    for item in obj:
        # item == list
        if isinstance(item, list):
            i = deepcopy(item)
            mylist.append(i)
        else:
            mylist.append(item)
    return mylist

你可能感兴趣的:(浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来设计,如何实现)