Python的深浅copy详解
Python的深浅copy详解
想要看明白原理,首先要清楚变量数据类型的可变不可变类型。
Python的数据类型可变不可变
当我们对列表进行复制一份给新的变量名的时候,一共有两种方式来进行分,分别是浅copy、深copy。那么两者有什么区别呢?都该什么时候使用呢?让我来为你揭晓吧。
一、浅copy的原理
首先说一下浅copy。
1.1 浅copy的定义
先看图
我们以copy一个列表为例。浅copy就是将Python的第一层的内存地址进行 了一下重新copy,新复制的列表内的地址仍指向原列表的内存地址。即新copy的列表内的元素指向的变量值得内存地址是同一个。
1.2 浅copy的方法
list1 = ["tom",18,["play","sleep"]]
# 1.使用copy()的方法。
list2 = list1.copy()
# 2.使用切片的方法。
list3 = list1[:]
二、深copy的原理
2.1 深copy的定义
先看图
仍以该列表为例。深copy是将原列表内部的可变数据类型重新申请了一块内存空间存放所含元素的内存地址,对于不可变数据类型则是直接指向其所在的内存空间地址。
2.2 深copy的方法
list1 = ["tom",18,["play","sleep"]]
# 深copy的方法
import copy
list2 = copy.deepcopy(list1)
三、深、浅copy的区别
深、浅copy主要区别就是在复制内部元素的可变数据类型方面。
浅copy对可变数据类型是共用一份内存地址,没有完全将原值和copy的值内存地址分开。当对可变数据类型进行改的时候,两者都会改变。
深copy则将可变数据类型存放的内存地址重新申请了一份内存空间,将两者完全分开。对可变数据类型进行改的时候,两者不会一起改变。