美文网首页
python的深拷贝和浅拷贝

python的深拷贝和浅拷贝

作者: 祁小彬 | 来源:发表于2022-01-23 06:43 被阅读0次

    1.什么是深拷贝?什么是浅拷贝?(深拷贝与浅拷贝的区别)
    简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,
    如果B没变,那就是深拷贝,自食其力。
    也可以这么说: 浅拷贝没有拷贝子对象,所以原始数据改变,子对象会改变;深拷贝,包含对象里面的子对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变

       浅拷贝(copy)就是把父对象拷过去,不会递归拷贝父对象里面包含子对象的值,而是拷贝的子对象的索引 (拷贝父对象,不会拷贝父对象内部的子对象)。如果子对象是一个可变对象,依然是可以修改的。如果父对象里没有可变的子对象那效果和深拷贝一样的。
    
        ===》 浅拷贝还可分拷贝的父对象是可变对象还是不可变对象,如果是可变对象可以使用copy模块的copy()方法或自带的copy()方法( object.copy() ),这两种方法效果是完全一样都实现浅拷贝;如果是不可变对象只能使用copy模块的copy()方法。不管拷贝的是可变对象,还是不可变对象,对父对象里的可变子对象的值都是可以修改的,只是拷贝后可变对象ID地址不一样,不可变对象ID地址一样。
    

    (1)父对象是可变对象拷贝,只拷贝父对象的的值,不会对其子对象的值进行拷贝而是拷贝的子对象的索引,然后创建一个新的对象(ID地址不一样),如果子对象是可变对象,依然是可以修改的。
    (2)父对象是不可变对象的拷贝,就是对另外一个变量的内存地址的拷贝(ID地址一样)或者说对象引用。

    import copy
    a1=[1,2]
    a2=[3,4]
    a=[a1,a2]
    b=copy.copy(a)#浅拷贝
    c=copy.deepcopy(a)#深拷贝
    print(id(a)) #140414167869960
    print(id(b)) #140414167869896
    print(id(c)) #140414167869832
    print(id(a[0])) # 140414167868488
    print(id(b[0])) #140414167868488
    print(id(c[0])) #140414167869768

    可以看出浅拷贝的子对象的地址没变,深拷贝变了

    """

     ====> 深拷贝(deepcopy)就是无论父对象里面包含子对象是可变还是不可变对象,都会递归拷贝子对象里边的所有值,而不是子对象的索引,产生一个新对象 (完全拷贝父对象及其子对象)。就像一个变量对另外一个变量的值拷贝。两个变量的内存地址不一样。对其任意一个变量的值改变不会改变另一个变量的值。使用copy模块的deepcopy()方法进行深拷贝。
    

    """
    import copy
    a1=(1,2)
    a2=(3,4)
    a=(a1,a2)
    b=copy.copy(a)
    c=copy.deepcopy(a)
    print(id(a)) #140648248055496
    print(id(b)) #140648248055496
    print(id(c)) #140648248055496
    print(id(a[0])) #140648248055944
    print(id(b[0])) #140648248055944
    print(id(c[0])) #140648248055944

    可以看出对不可变数据类型都是引用

    """

    相关文章

      网友评论

          本文标题:python的深拷贝和浅拷贝

          本文链接:https://www.haomeiwen.com/subject/dtbhcrtx.html