python深浅copy一分钟掌握

用了那么久的python,一直以为对深浅copy理解足够透彻,今天给人讲的时候感觉自己对这方面认知还有所欠缺,看了下网上许多人写的讲解,发现讲的很模糊,很多又是重复不清楚的。现在我将对python中的深浅拷贝进行一阅即通的概述。
首先我们知道的,在python里对对象进行拷贝有三个,即赋值,深拷贝,浅拷贝。而对象又分为两种,一种是不可变对象(字符串、元组、数字 ),一种是可变对象(列表、字典)。而深浅拷贝有三种情况:

  • 拷贝的是不可变对象
  • 拷贝的是可变对象
  • 拷贝的可变对象里面还有子对象

首先我们先来看看不可变对象:

import copy
list0 = 'hello,world'
list1 = copy.copy(list0)
list2 = copy.deepcopy(list0)
list3 = list0

print(list0, id(list0))
print(list1, id(list1))
print(list2, id(list2))
print(list3, id(list3))

python深浅copy一分钟掌握_第1张图片
现在我们来list0进行修改,list0 = list0 + 'good evening'
python深浅copy一分钟掌握_第2张图片
我们可以看到,即使修改了list0,其他的值也不会变,地址也没有变。
所以我们可以下个结论:对于不可变对象来说,深浅拷贝都一样的,即便是用深拷贝,也都是一样的id,如果要重新赋值,也只是创建一个新的对象,替换旧的对象。所以对于不可变对象来说,不管怎么拷贝,它的地址、值都是一样的。
现在我们来看看可变对象(我们用一个列表来做示范):

import copy
list0 = [1,2,3,4,5,6]
list1 = copy.copy(list0)
list2 = copy.deepcopy(list0)
list3 = list0

print(list0, id(list0))
print(list1, id(list1))
print(list2, id(list2))
print(list3, id(list3))

python深浅copy一分钟掌握_第3张图片
对于可变对象来说:

  • 赋值(我们暂且称它为’=浅拷贝’)的新对象与原对象相比,值相等,地址也相等;
  • 浅拷贝:与原对象相比,值相等,地址不相等;
  • 深拷贝:与原对象相比,值相等,地址不相等。

现在我们来修改list0的值, 在list0后面append(7)再来看看输出:
python深浅copy一分钟掌握_第4张图片

现在我们可以看到,在修改了原来的list0之后,深浅拷贝的值依旧不变。
而当可变对象里面还包含子对象的时候,即如下,list0里面还有一个list,现在我们对原对象(list0)里面的子对象追加一个c

import copy
list0 = [1,2,3,4,5,6, ['a', 'b']]
list1 = copy.copy(list0)
list2 = copy.deepcopy(list0)
list3 = list0
list0[6].append('c')
print(list0, id(list0))
print(list1, id(list1))
print(list2, id(list2))
print(list3, id(list3))

python深浅copy一分钟掌握_第5张图片
现在我们可以清楚的了解到,浅拷贝和赋值对象里的子对象发生了改变,所以我们可以得出一个结论:浅拷贝没有拷贝子对象,所以原对象发生改变,其子对象也发生了改变,而深拷贝拷贝了子对象,原对象发生改变,其本身也不会改变。

你可能感兴趣的:(python基础)