python基础(29)深浅拷贝

  • 深浅拷贝

    • 浅拷贝

      • 不可变类型,不拷贝

        >>> import copy
        >>> v1 = "hello world"
        >>> v2 = copy.copy(v1)
        >>> id(v1)
        44127840
        >>> id(v2)
        44127840
        
        """
        >>> v3 = "hello world"
        >>> id(v3)
        44129160
        
        # 带有空格的字符串内存地址不相同,
        # 把一个变量赋值给另一个变量地址是相同的
        >>> v3 = v1
        >>> id(v3)
        44127840
        """
        

        拷贝v1后,v2的内存地址应该也会不同,但由于优化机制,内存地址是相同的,因为对于不可变类型而言,如果修改值,会重新创建一份,不会影响原来数据,所以,不拷贝也没关系

      • 可变类型,只拷贝第一层,内部的可变类型不可变类型都不会拷贝

        >>> import copy
        >>> v1 = [11,22,33,[234,567]]
        >>> v2 = copy.copy(v1)
        >>> v1
        [11, 22, 33, [234, 567]]
        >>> v2
        [11, 22, 33, [234, 567]]
        # 翻船了,怎么可能
        >>> id(v1)
        44373640
        >>> id(v2)
        44116872
        >>> id(v1[2])
        268478896
        >>> id(v2[2])
        268478896
        
    • 深拷贝

      • 不可变类型,不拷贝

        >>> import copy
        >>> v1 = ("hello world",)
        >>> v2 = copy.deepcopy(v1)
        >>> id(v1)
        44322904
        >>> id(v2)
        44322904
        
      • 特殊情况,元组,不可变类型

        • 浅拷贝,永远不会拷贝

        • 深拷贝,找到内部有的可变类型或者含有可变类型的元组拷贝一份

          >>> import copy
          >>> v1 = ("hello world",[11,22])
          >>> v2 = copy.deepcopy(v1)
          >>> id(v1)
          44356616
          >>> id(v2)
          44353064
          

          含可变类型的元组

          >>> v1 = ("hello world",(11,22))
          >>> v2 = copy.deepcopy(v1)
          >>> id(v1)
          44344232
          >>> id(v2)
          44344232
          
          >>> v1 = ("hello world",(11,22,[11,22]))
          >>> v2 = copy.deepcopy(v1)
          >>> id(v1)
          44322280
          >>> id(v2)
          44344552
          
      • 深拷贝,对于可变类型,无论在哪一层都会拷贝

        >>> v1 = ("hello world",[11,22,(11,22,[22,"dd"])])
        >>> v2 = copy.deepcopy(v1)
        >>> id(v1)
        44322280
        >>> id(v2)
        44344168
        

    总结:

    **import copy **

    深浅拷贝一般都是针对可变类型,不可变类型没什么意义,都是一块内存地址

    浅拷贝,copy.copy,只拷贝第一层的可变类型

    深拷贝,copy.deepcopy拷贝所有层的可变类型,即元素中有可变类型也会拷贝,

    如果遇到元组会找到内部有的可变类型或者含有可变类型的元组拷贝一份

posted @ 2021-11-07 20:34  下个ID见  阅读(24)  评论(0)    收藏  举报