关键词搜索

源码搜索 ×
×

Python_浅拷贝与深拷贝

发布2021-01-11浏览257次

详情内容

  1. 例子

(1)原对象(b1)可变

1 >>> import copy
2 >>> a1 = [1, 2, 3]
3 >>> a2 = 4
4 >>> b1 = [a1, a2]
5 >>> b2 = copy.copy(b1)    # 浅拷贝
6 >>> b3 = copy.deepcopy(b1)    # 深拷贝

    最外层对象的地址:浅拷vb.net教程贝和深拷贝都改变了

    1 >>> id(b1)
    2 1664414246280
    3 >>> id(b2)
    4 1664414248328
    5 >>> id(b3)
    6 1664414247944
    
      1 >>> b1.append(5)
      2 >>> b1
      3 [[1, 2, 3], 4, 5]
      4 >>> b2
      5 [[1, 2, 3], 4]
      6 >>> b3
      7 [[1, 2, 3], 4]
      
        7

      内部可变对象的地址:浅拷贝没c#教程有改变,深拷贝改变了

      1 >>> id(b1[0])
      2 1664416938696
      3 >>> id(b2[0])
      4 1664416938696
      5 >>> id(b3[0])
      6 1664414247624
      
        1 >>> a1.append('a')
        2 >>> b1
        3 [[1, 2, 3, 'a'], 4, 5]
        4 >>> b2
        5 [[1, 2, 3, 'a'], 4]
        6 >>> b3
        7 [[1, 2, 3], 4]
        
          7

        内部不可变对象的地址:浅拷贝和深python基础教程拷贝都没有改变

        1 >>> id(b1[1])
        2 140735360230128
        3 >>> id(b2[1])
        4 140735360230128
        5 >>> id(b3[1])
        6 140735360230128
        

          (2)原对象(c1)不可变

          1 >>> import copy
          2 >>> a1 = [1, 2, 3]
          3 >>> a2 = 4
          4 >>> c1 = (a1, a2)
          5 >>> c2 = copy.copy(c1)
          6 >>> c3 = copy.deepcopy(c1)
          

            最外层对象的地址:浅拷贝没有改变,深拷贝改变了

            1 >>> id(c1)
            2 1664417250952
            3 >>> id(c2)
            4 1664417250952
            5 >>> id(c3)
            6 1664416938248
            

              内部可变对象的地址:浅拷贝没有改变,深拷贝改变了

              1 >>> id(c1[0])
              2 1664416938696
              3 >>> id(c2[0])
              4 1664416938696
              5 >>> id(c3[0])
              6 1664417297160
              
                1 >>> a1.append('a')
                2 >>> c1
                3 ([1, 2, 3, 'a'], 4)
                4 >>> c2
                5 ([1, 2, 3, 'a'], 4)
                6 >>> c3
                7 ([1, 2, 3], 4)
                
                  7

                内部不可变对象的地址:浅拷贝和深拷贝都没有改变

                1 >>> id(c1[1])
                2 140735360230128
                3 >>> id(c2[1])
                4 140735360230128
                5 >>> id(c3[1])
                6 140735360230128
                
                  1. 总结

                  (1)最外层对象:浅拷贝在对象可变时改变了地址,不可变时没有改变地址;而深拷贝都会改变地址

                  (2)内部可变对象:浅拷贝都没有改变地址;深拷贝都会改变地址

                  (3)内部不可变对象:浅拷贝和深拷贝都没有改变地址

                  注:地址的改变,表示对原对象进行的修改不会对新对象产生影响。因此,在实际应用中,需根据需求选择是浅拷贝还是深拷贝。

                  相关技术文章

                  点击QQ咨询
                  开通会员
                  返回顶部
                  ×
                  微信扫码支付
                  微信扫码支付
                  确定支付下载
                  请使用微信描二维码支付
                  ×

                  提示信息

                  ×

                  选择支付方式

                  • 微信支付
                  • 支付宝付款
                  确定支付下载