Python-list 深拷贝与浅拷贝
Python-list 深拷贝与浅拷贝
概念
Python中的深拷贝和浅拷贝和java里面的概念是一样的,所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝。
-
赋值操作
- 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 );
- 修改不可变对象(str、tuple)需要开辟新的空间;
- 修改可变对象(list等)不需要开辟新的空间;
-
深拷贝
- 浅拷贝,仅仅复制了容器中元素的地址;
- 浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。
- 也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。
-
浅拷贝
- 深拷贝,完全拷贝了一个副本,容器内部元素地址都不一样;
- 深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。
- 也就是说新的容器中指向了新的元素,新元素和旧元素值形同( 新瓶装新酒 )。
-
优缺点
浅拷贝
占用内存较少,深拷贝
占用内存较大浅拷贝
修改深层数据,会影响原数据深拷贝
修改数据,互不影响
栗子
"""
深浅拷贝
浅拷贝 复制 一层
深拷贝 复制 全部
修改拷贝后是否影响拷贝前?
如果数据有 1份, 那么互相影响
如果数据有 2份, 那么互不影响
"""
# 准备深拷贝工具
import copy
list_01 = [10, [20, 30]]
list_02 = list_01 # 赋值
list_03 = list_01[:] # 切片(浅拷贝)
list_04 = copy.deepcopy(list_01) # 深拷贝
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 # 修改深拷贝后数据 不影拷贝前的数据