Python 深拷贝和浅拷贝详解

发布时间 2023-06-14 15:04:19作者: 凡人半睁眼

一、Python 深拷贝和浅拷贝概念理解

1、浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用

2、深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联

3、对于不可变对象,深拷贝和浅拷贝的效果是一样的,因为不可变对象不需要在内存中复制

4、对于可变对象,深拷贝和浅拷贝的效果是有区别的,主要原因在于可变对象自身的可变性质

二、浅拷贝

1、使用数据类型本身的构造器(list() dict() set() 等)

list1 = [1, 2, 3]
list2 = list(list1)
print(list2)
print("list1==list2 ?",list1==list2) # list1==list2 ? True
print("list1 is list2 ?",list1 is list2) # list1 is list2 ? False

set1= set([1, 2, 3])
set2 = set(set1)
print(set2)
print("set1==set2 ?",set1==set2)
print("set1 is set2 ?",set1 is set2)

dict1 = {1:[1,'w'], 2:0, 3:98}
dict2 = dict(dict1)
print(dict2)
print("dict1 == dict2 ?",dict1 == dict2)
print("dict1 is dict2 ?",dict1 is dict2)

2、对于可变的序列,还可以通过切片操作符 : 来完成浅拷贝

list1 = [1, 2, 3]
list2 = list1[:]
print(list2)
print("list1 == list2 ?",list1 == list2)
print("list1 is list2 ?",list1 is list2)

[1, 2, 3]
list1 == list2 ? True
list1 is list2 ? False

3、Python 还提供了对应的函数 copy.copy() 函数,适用于任何数据类型

import copy

list1 = [1, 2, 3]
list2 = copy.copy(list1)
print(list2)
print("list1 == list2 ?",list1 == list2)
print("list1 is list2 ?",list1 is list2)

set1 = {1, 2, 3}
set2 = copy.copy(set1)
print(set2)
print("set1 == set2 ?",set1 == set2)
print("set1 is set2 ?",set1 is set2)

dict1 = {1:'xiaoming', 2:'xiahua',3:'xiaoli'}
dict2 = dict(dict1)
print(dict2)
print("dict1 == dict2 ?",dict1 == dict2)
print("dict1 is dict2 ?",dict1 is dict2)

4、对于元组,使用 tuple() 或者切片操作符 ‘:’ 不会创建一份浅拷贝,相反它会返回一个指向相同元组的引用

tuple1 = (1, 2, 3)
tuple2 = tuple(tuple1)
print(tuple2)  # (1, 2, 3)
print("tuple1 == tuple2 ?",tuple1 == tuple2) # tuple1 == tuple2 ? True
print("tuple1 is tuple2 ?",tuple1 is tuple2) # tuple1 is tuple2 ? True

tuple1 = (1, 2, 3)
tuple2 = tuple1[:]
print(tuple2) # (1, 2, 3)
print("tuple1 == tuple2 ?",tuple1 == tuple2) # tuple1 == tuple2 ? True
print("tuple1 is tuple2 ?",tuple1 is tuple2) # tuple1 is tuple2 ? True