zoukankan      html  css  js  c++  java
  • python之深浅拷贝

        基础没打牢,python的深浅copy老是混淆,模棱两可的。。。

       一、对象赋值:

         a = [1,2,3]

        b = a       # 对象赋值

        print(id(a))

        print(id(b))

        执行上面的代码,可以发现id(a)=id(b)

        为什么呢?其实是在内存中有一个列表 [1,2,3],a和b就是两个标签,都指向列表 [1,2,3]如下图:

        

        当修改a为: 

        a = [11,22,33]

        然后

        print(a)

        print(b)

        结果为:

        [11,22,33]

        [1,2,3]

        原因如下图:

        

         a = [11,22,33]

        上面这行代码的意思的把标签 a 指向了内存中的另一个对象[11,22,33]

    二、copy()-------浅copy:

        a = [1,2,3]

        b = a.copy()

        #如果是导入copy模块的话要这么用,如下

        #from copy import copy

        #b = copy(a)

        print(id(a))

        print(id(b))

        此时id(a)是不等于id(b),所以当你修改a为:

         a = [11,22,33]

        然后

        print(a)

        print(b)

        结果为:

        [11,22,33]

        [1,2,3]

        结论: 浅copy和对象赋值所看到的的效果是一样的

        但是,如果当a是这样嵌套列表,程序如下:

        a = [1,2,3,[4,5]]

        b = a.copy()

        print(id(a))

        print(id(b))    同上,id(a)是不等于id(b)的,也就是a 和b是在内存中的两个对象,只不过是有一个公共的部分 [4,5], 

    当修改这个公共部分的时候,列表a、b都会发生改变,例如:修改a[3][0]:    

        a[3][0] =0

        print(a)

        print(b)

        结果为:

        [1,2,3,[0,5]]

        [1,2,3,[0,5]]

        这个地方很容易混淆的,为什么改一个,都改了呢?首先,两个的id值是不同的,所以不可能是同一对象的原因。其实真正的原因就是所谓的浅拷贝,浅拷贝只是复制了第一层也就是[1,2,3,[xxx,xxx]],也就是最外面的列表,内层中嵌套的列表没有复制,而内层的列表[4,5]还是a和b公共的部分,不信的可以执行下面代码:

        print(id(a[3]))

        print(id(b[3]))   

    三、deepcopy()------- 深copy

        深copy就可以对应解决浅copy中嵌套的问题,代码如下:

        from copy import deepcopy

        a = [1,2,3,[4,5]]

        b = deepcopy(a)

        print(id(a))

        print(id(b))

        同上,id(a)是不等于id(b)的

        修改a[3][0]为:    

        a[3][0] =0

        print(a)

        print(b)

        结果为:

        [1,2,3,[0,5]]

        [1,2,3,[4,5]]

        

        突然发现,虽然简单的东西,这么详详细细的写下来,自己反倒是加深不少印象。。。

  • 相关阅读:
    无限维
    黎曼流形
    why we need virtual key word
    TOJ 4119 Split Equally
    TOJ 4003 Next Permutation
    TOJ 4002 Palindrome Generator
    TOJ 2749 Absent Substrings
    TOJ 2641 Gene
    TOJ 2861 Octal Fractions
    TOJ 4394 Rebuild Road
  • 原文地址:https://www.cnblogs.com/MisterZZL/p/9534298.html
Copyright © 2011-2022 走看看