Python - 复制列表



在 Python 中复制列表

在 Python 中复制列表是指创建一个包含与原始列表相同元素的新列表。复制列表有不同的方法,包括使用 slice notation、list() 函数和使用 copy() 方法。

每种方法在创建浅拷贝还是深拷贝方面的行为都不同。让我们在本教程中深入讨论所有这些。

Python 列表上的浅层复制

Python 中的浅表复制会创建一个新对象,但它不是递归复制元素,而是仅复制对原始元素的引用。这意味着新对象是独立于原始对象的实体,但如果元素本身是可变的,则对新对象中的这些元素所做的更改也会影响原始对象。

浅拷贝示例

让我们用下面的例子来说明这一点 -


import copy
# Original list
original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# Creating a shallow copy
shallow_copied_list = copy.copy(original_list)
# Modifying an element in the shallow copied list
shallow_copied_list[0][0] = 100
# Printing both lists
print("Original List:", original_list)
print("Shallow Copied List:", shallow_copied_list)

如你所见,即使我们只修改了浅层复制列表中第一个子列表的第一个元素,相同的更改也会反映在原始列表中。

这是因为浅表副本仅创建对原始对象的新引用,而不是创建对象本身的副本 -

Original List: [[100, 2, 3], [4, 5, 6], [7, 8, 9]]
Shallow Copied List: [[100, 2, 3], [4, 5, 6], [7, 8, 9]]

Python 列表上的深层复制

Python 中的深层复制会创建一个全新的对象,并递归复制原始对象引用的所有对象。这意味着,即使是原始对象中的嵌套对象也会被复制,从而产生一个完全独立的副本,其中对复制的对象所做的更改不会影响原始对象,反之亦然。

Deep Copy 示例

让我们用下面的例子来说明这一点 -


import copy
# Original list
original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# Creating a deep copy
deep_copied_list = copy.deepcopy(original_list)
# Modifying an element in the deep copied list
deep_copied_list[0][0] = 100
# Printing both lists
print("Original List:", original_list)
print("Deep Copied List:", deep_copied_list)

可以看到,当我们修改深度复制列表中第一个子列表的第一个元素时,不会影响原始列表。

这是因为深层复制会创建一个新对象并递归复制所有嵌套对象,从而确保复制的对象完全独立于原始对象 -

Original List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Deep Copied List: [[100, 2, 3], [4, 5, 6], [7, 8, 9]]

使用 Slice 表示法复制列表

Python 中的切片表示法允许您通过指定开始索引、结束索引和可选的步长,从序列(如列表、元组或字符串)创建元素的子序列。切片表示法的语法如下 -


 [start:end:step]

其中, start 是切片开始的索引,end 是切片结束的索引 (不包括),step 是元素之间的步长。

我们可以通过指定原始列表的整个索引范围来使用 slice notation 复制列表。这实际上会创建一个具有与原始列表相同元素的新列表。

对复制的列表所做的任何修改都不会影响原始列表,反之亦然,因为它们是内存中的单独对象。

在这个例子中,我们正在创建 “original_list” 的切片,有效地将其所有元素复制到一个新的列表 “copied_list” -


# Original list
original_list = [1, 2, 3, 4, 5]
# Copying the list using slice notation
copied_list = original_list[1:4]
# Modifying the copied list
copied_list[0] = 100
# Printing both lists
print("Original List:", original_list)
print("Copied List:", copied_list)

我们得到的结果如下所示 -

Original List: [1, 2, 3, 4, 5]
Copied List: [100, 3, 4]

使用 list() 函数复制列表

Python 中的 list() 函数是用于创建新列表对象的内置函数。它可以接受一个可迭代对象(如另一个列表、元组、集合等)作为参数,并创建一个包含该可迭代对象元素的新列表。如果未提供任何参数,则会创建一个空列表。

我们可以使用 list() 函数通过将原始列表作为参数传递来复制列表。这将创建一个新的列表对象,其中包含与原始列表相同的元素。

在下面的示例中,我们使用 list() 函数创建一个新的列表对象 “copied_list”,其中包含与 “original_list” 相同的元素 -


# Original list
original_list = [1, 2, 3, 4, 5]
# Copying the list using the list() constructor
copied_list = list(original_list)
# Printing both lists
print("Original List:", original_list)
print("Copied List:", copied_list)

以下是上述代码的输出 -

Original List: [1, 2, 3, 4, 5]
Copied List: [1, 2, 3, 4, 5]

使用 copy() 函数复制列表

在 Python 中,copy() 函数用于创建列表或其他可变对象的浅表副本。此函数是 Python 标准库中 copy 模块的一部分。

我们可以通过在原始列表上调用 copy() 函数来复制列表。这将创建一个新的列表对象,该对象包含与原始列表相同的元素。

在下面的示例中,我们使用 copy() 函数创建一个新的列表对象 “copied_list”,其中包含与 “original_list” 相同的元素 -


import copy
original_list = [1, 2, 3, 4, 5]
# Copying the list using the copy() function
copied_list = copy.copy(original_list)
print("Copied List:", copied_list)

上述代码的输出如下所示 -

Copied List: [1, 2, 3, 4, 5]