Python-list 深拷贝与浅拷贝

Python-list 深拷贝与浅拷贝



概念

Python中的深拷贝和浅拷贝和java里面的概念是一样的,所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝。

  1. 赋值操作

    • 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 );
    • 修改不可变对象(str、tuple)需要开辟新的空间;
    • 修改可变对象(list等)不需要开辟新的空间;
  2. 深拷贝

    • 浅拷贝,仅仅复制了容器中元素的地址;
    • 浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。
    • 也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。
  3. 浅拷贝

    • 深拷贝,完全拷贝了一个副本,容器内部元素地址都不一样;
    • 深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。
    • 也就是说新的容器中指向了新的元素,新元素和旧元素值形同( 新瓶装新酒 )。
  4. 优缺点

    • 浅拷贝 占用内存较少,深拷贝 占用内存较大
    • 浅拷贝 修改深层数据,会影响原数据
    • 深拷贝 修改数据,互不影响

栗子

"""
  深浅拷贝
      浅拷贝 复制 一层
      深拷贝 复制 全部
      修改拷贝后是否影响拷贝前?
          如果数据有 1份, 那么互相影响
          如果数据有 2份, 那么互不影响
"""
# 准备深拷贝工具
import copy

list_01 = [10, [20, 30]]
list_02 = list_01    # 赋值
list_03 = list_01[:]    # 切片(浅拷贝)
list_04 = copy.deepcopy(list_01)    # 深拷贝

202209011636405


list_02[0] = 10000   # 因为数据1份,所以互相影响
list_02[1][0] = 20000

list_03[0] = 1000    # 修改浅拷贝浅数据不影响拷贝前的数据
list_03[1][0] = 2000     # 修改浅拷贝深层数据影响拷贝前的数据

list_04[0] = 100
list_04[1][0] = 200    # 修改深拷贝后数据 不影拷贝前的数据

202209011636411



posted @ 2021-06-01 23:14  Librarookie  阅读(417)  评论(0编辑  收藏  举报