Python-list 深拷贝与浅拷贝



概念

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

  1. 赋值操作
  • 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 );
  • 修改不可变对象(str、tuple)需要开辟新的空间;
  • 修改可变对象(list等)不需要开辟新的空间;
  1. 深拷贝
  • 浅拷贝,仅仅复制了容器中元素的地址;
  • 浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。
  • 也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。
  1. 浅拷贝
  • 深拷贝,完全拷贝了一个副本,容器内部元素地址都不一样;
  • 深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。
  • 也就是说新的容器中指向了新的元素,新元素和旧元素值形同( 新瓶装新酒 )。
  1. 优缺点
  • 浅拷贝 占用内存较少,深拷贝 占用内存较大
  • 浅拷贝 修改深层数据,会影响原数据
  • 深拷贝 修改数据,互不影响


栗子

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

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

列表深拷贝 python python list深拷贝_数据


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    # 修改深拷贝后数据 不影拷贝前的数据

列表深拷贝 python python list深拷贝_数据_02