📅  最后修改于: 2023-12-03 15:19:32.567000             🧑  作者: Mango
在 Python 中,有时我们需要将一个对象复制到另一个变量中。但是,简单地使用赋值操作符 =
不总是适当的,因为它只是将指针从一个对象指向另一个对象。
在这种情况下,我们需要使用 Python 中的复制机制。 Python 有两种基本的复制机制:浅层复制和深层复制。
当我们使用浅层复制时,我们只复制对象的最外层。换句话说,它复制了所有引用,但没有复制引用所指向的对象。因此,浅层复制产生了一个新对象,该对象与原始对象共享相同的子对象。
在 Python 中,我们可以使用 copy
模块提供的方法 copy()
来执行浅层复制。以下是使用 copy()
方法进行浅层复制的示例代码:
import copy
# 原始列表
list1 = ['hello', [1, 2, 3], 'world']
# 浅层复制
list2 = copy.copy(list1)
# 修改原始列表
list1[1][0] = 4
# 打印复制后的列表和原始列表
print("浅层复制后的列表:", list2)
print("原始列表:", list1)
输出:
浅层复制后的列表: ['hello', [4, 2, 3], 'world']
原始列表: ['hello', [4, 2, 3], 'world']
从输出中可以看出,修改原始列表中的子列表也修改了浅层复制后的列表中相应的子列表。
Python 还提供了一种简单的方法来执行浅层复制,即使用切片。以下是使用切片进行浅层复制的示例代码:
# 原始列表
list1 = ['hello', [1, 2, 3], 'world']
# 浅层复制
list2 = list1[:]
# 修改原始列表
list1[1][0] = 4
# 打印复制后的列表和原始列表
print("浅层复制后的列表:", list2)
print("原始列表:", list1)
输出:
浅层复制后的列表: ['hello', [4, 2, 3], 'world']
原始列表: ['hello', [4, 2, 3], 'world']
从输出中可以看出,切片复制也遵循相同的方式,即修改原始列表中的子列表也修改了浅层复制后的列表中相应的子列表。
与浅层复制不同,深层复制会复制整个对象,包括所有子对象。 因此,深层复制生成一个独立的对象,并不共享任何子对象。
copy
模块还提供了一种方法 deepcopy()
来执行深层复制。以下是使用 deepcopy()
方法进行深层复制的示例代码:
import copy
# 原始列表
list1 = ['hello', [1, 2, 3], 'world']
# 深层复制
list2 = copy.deepcopy(list1)
# 修改原始列表
list1[1][0] = 4
# 打印复制后的列表和原始列表
print("深层复制后的列表:", list2)
print("原始列表:", list1)
输出:
深层复制后的列表: ['hello', [1, 2, 3], 'world']
原始列表: ['hello', [4, 2, 3], 'world']
从输出中可以看出,修改原始列表中的子列表不会修改深层复制后的列表中相应的子列表。
pickle
是 Python 的一个内置模块,它提供了一种序列化和反序列化 Python 对象的方法。 在 pickle
中,我们可以使用 loads()
和 dumps()
方法分别将 Python 对象转换为字符串和从字符串将对象还原回原始形式。
因此,我们可以使用 pickle
模块的 loads()
和 dumps()
方法来执行深层复制。以下是使用 pickle
模块进行深层复制的示例代码:
import pickle
# 原始列表
list1 = ['hello', [1, 2, 3], 'world']
# 深层复制
list2 = pickle.loads(pickle.dumps(list1))
# 修改原始列表
list1[1][0] = 4
# 打印复制后的列表和原始列表
print("深层复制后的列表:", list2)
print("原始列表:", list1)
输出:
深层复制后的列表: ['hello', [1, 2, 3], 'world']
原始列表: ['hello', [4, 2, 3], 'world']
从输出中可以看出,修改原始列表中的子列表不会修改深层复制后的列表中相应的子列表。
在 Python 中,我们可以使用浅层复制和深层复制来复制对象。浅层复制只复制对象的最外层,而深层复制则复制整个对象,包括所有子对象。因此,在使用复制操作时,我们应该根据需要选择适当的类型。