Python中copy和deepcopy的区别

概述

在Python中,copy和deepcopy是用于创建对象副本的两个函数。它们都可以用于列表、字典、集合等可变对象,但在复制过程中存在一定的区别。

流程图

journey
    title 复制对象流程
    section copy
        开始 --> 创建一个对象的副本
        创建一个对象的副本 --> 修改原始对象
        修改原始对象 --> 打印原始对象和副本对象
    section deepcopy
        开始 --> 创建一个对象的副本
        创建一个对象的副本 --> 修改原始对象
        修改原始对象 --> 打印原始对象和副本对象

copy函数

copy函数用于创建一个对象的浅层副本。浅层副本是原始对象的一个引用,因此当原始对象发生变化时,副本对象也会随之变化。copy函数的使用方法如下:

import copy

copy_obj = copy.copy(obj)

deepcopy函数

deepcopy函数用于创建一个对象的深层副本。深层副本是原始对象的一个完全独立的副本,当原始对象发生变化时,副本对象不会受到任何影响。deepcopy函数的使用方法如下:

import copy

copy_obj = copy.deepcopy(obj)

区别

copy和deepcopy函数的主要区别在于复制过程中的对象关联性。

copy函数的对象关联性

当使用copy函数创建一个对象的副本时,副本对象和原始对象之间存在对象关联性。也就是说,当修改原始对象时,副本对象也会随之修改。下面是一个示例:

import copy

lst1 = [1, 2, 3]
lst2 = copy.copy(lst1)

print("原始列表:", lst1)
print("副本列表:", lst2)

lst1.append(4)

print("修改原始列表后:", lst1)
print("副本列表的变化:", lst2)

运行结果如下:

原始列表: [1, 2, 3]
副本列表: [1, 2, 3]
修改原始列表后: [1, 2, 3, 4]
副本列表的变化: [1, 2, 3, 4]

可以看到,当我们修改原始列表时,副本列表也随之发生了变化。

deepcopy函数的对象关联性

当使用deepcopy函数创建一个对象的副本时,副本对象和原始对象之间不存在对象关联性。也就是说,当修改原始对象时,副本对象不会受到任何影响。下面是一个示例:

import copy

lst1 = [1, 2, 3]
lst2 = copy.deepcopy(lst1)

print("原始列表:", lst1)
print("副本列表:", lst2)

lst1.append(4)

print("修改原始列表后:", lst1)
print("副本列表的变化:", lst2)

运行结果如下:

原始列表: [1, 2, 3]
副本列表: [1, 2, 3]
修改原始列表后: [1, 2, 3, 4]
副本列表的变化: [1, 2, 3]

可以看到,当我们修改原始列表时,副本列表没有任何变化。

小结

在Python中,copy和deepcopy函数是用于创建对象副本的两个重要函数。copy函数创建的是一个对象的浅层副本,副本对象和原始对象之间存在对象关联性;而deepcopy函数创建的是一个对象的深层副本,副本对象和原始对象之间不存在对象关联性。根据具体的需求,我们可以选择合适的函数来创建对象的副本。