详解Python列表赋值复制深拷贝及5种浅拷贝

  • Post category:Python

详解Python列表赋值复制深拷贝及5种浅拷贝

在Python中,列表是一种常见的数据类型,它可以存储任意类型的数据。在使用时,我们经常需要对其进行赋值、复制和拷贝等操作。本攻略将详细介绍Python中列表的赋值、复制深拷贝和浅拷贝等操作。

列表赋值

在Python中,列表赋值是将一个列表的引用赋值给另一个变量。这意味着两个变量将引用同一个列表对象。以下是一个示例代码,演示如何进行列表赋值:

# 列表赋值
list1 = [1, 2, 3]
list2 = list1

# 修改list1中的元素
list1[0] = 100

# 输出list1和list2
print(list1)  # 输出[100, 2, 3]
print(list2)  # 输出[100, 2, 3]

在上面的示例代码中,我们将列表list1的引用赋值给了list2,并修改了list1中的元素。由于list1list2引用同一个列表对象,所以修改list1中的元素也会影响list2中的元素。

列表复制

在Python中,列表复制是将一个列表的所有元素复制到一个新的列表中。这意味着两个列表是独立的,修改一个列表不会影响另一个列表。以下是一个示例代码,演示如何进行列表复制:

# 列表复制
list1 = [1, 2, 3]
list2 = list1.copy()

# 修改list1中的元素
list1[0] = 100

# 输出list1和list2
print(list1)  # 输出[100, 2, 3]
print(list2)  # 输出[1, 2, 3]

在上面的示例代码中,使用copy()方法将list1复制到list2,并修改了list1中的元素。由于list1list2是独立的,所以修改list1中的元素不会影响list2中的元素。

列表浅拷贝

在Python中,列表浅拷贝是将一个列表的所有元素复制到一个新的列表中,但是对于嵌套的列表、元组、字典等对象,只复制其引用而不是对象本身。这意味着修改嵌套对象中的元素会影响原始列表和浅拷贝的列表。以下是一个示例代码,演示如何进行列表浅拷贝:

# 列表浅拷贝
list1 = [1, 2, [3, 4]]
list2 = list1.copy()

# 修改list1中的元素
list1[2][0] = 100

# 输出list1和list2
print(list1)  # 输出[1, 2, [100, 4]]
print(list2)  # 输出[1, 2, [100, 4]]

在上面的示例代码中,我们使用copy()方法将list1浅拷贝到list2,并修改了list1嵌套列表的元素。由于浅拷贝只复制了嵌套列表的引用,所以修改嵌套列表中的元素会影响原始列表和浅拷贝的列表。

列表深拷贝

在Python中,列表深拷贝是将一个列表的所有元素复制到一个新列表中,包括嵌套的列表、元组、字典等对象。这意味着深拷贝的列表是完全独立的,修改一个列表会影响另一个列表。以下是一个示例代码,演示如何进行列表深拷贝:

# 列表深拷贝
import copy

list1 = [1, 2, [3, 4]]
list2 = copy.deepcopy(list1)

# 修改list1中的元素
list1[2][0] = 100

# 输出list1和list2
print(list1)  # 输出[1, 2, [100, 4]]
print(list2)  # 输出[1, 2, [3, 4]]

在上面的示例代码中,我们使用deepcopy()方法将list1深拷贝到list2,并修改了list1中嵌套列表的元素。由于深拷贝复制了嵌套列表的对象本身,所以修改嵌套列表中的元素不会影响原始列表和深拷贝的列表。

5种浅拷贝

在Python中,除了使用copy()方法进行浅拷贝外,还有5种方法可以进行浅拷贝。这些方法包括切片、list()构造函数、*运算符、list.copy()方法和copy.copy()方法。以下是一个示例代码,演示如何使用这5种方法进行浅拷贝:

# 5种浅拷贝方法
list1 = [1, 2, [3, 4]]

# 切片
list2 = list1[:]
# list()构造函数
list3 = list(list1)
# *运算符
list4 = list1 * 1
# list.copy()方法
list5 = list1.copy()
# copy.copy()方法
import copy
list6 = copy.copy(list1)

# 修改list1中的元素
list1[2][0] = 100

# 输出list1和浅拷贝的列表
print(list1)  # 输出[1, 2, [100, 4]]
print(list2)  # 输出[1, 2, [100, 4]]
print(list3)  # 输出[1, 2, [100, 4]]
print(list4)  # 输出[1, 2, [100, 4]]
print(list5)  # 输出[1, 2, [100, 4]]
print(list6)  # 输出[1, 2, [100, 4]]

在上面的示例代码中,我们使用了5种方法进行浅拷贝,并修改了原始列表中嵌套列表的元素。由浅拷贝只复制了嵌套列表的引用,所以修改嵌套列表中的元素会影响原始列表和浅拷贝的列表。

示例

以下是另一个示例代码,演示如何在Python中使用浅复制和深复制:

# 创建一个列表
my_list = [1, 2, 3, [4, 5, 6]]

# 进行浅复制
new_list1 = my_list.copy()

# 进行深复制
import copy
new_list2 = copy.deepcopy(my_list)

# 修改原列表中的元素
my_list[3][0] = 100

# 输出原列表和新列表
print(my_list)  # 输出[1, 2, 3, [100, 5, 6]]
print(new_list1)  # 输出[1, 2, 3, [100, 5, 6]]
print(new_list2)  # 输出[1, 2, 3, [4, 5, 6]]

在上面的示例代码中,我们创建了一个列表my_list,并进行了浅复制和深复制,分别创建了新列表new_list1new_list2。然后,我们修改了原列表中的元素[4, 5, 6]的第一个元素为100。最后,我们输出了原列表和新列表,发现浅复制的新列表和原列表中的元素指向同一个内存地址,所以修改原列表中的元素也会影响新列表中的元素;而深复制的新列表和原列表中的元素不是同一个内存地址,所以修改原列表中的元素不会影响新列表中的元素。

总结

在Python中,列表的复制有两种方式:浅复制和深复制。浅复制是指复制一个列表,创建一个新的列表,但是新列表中的元素是原列表中元素的引用;深复制是指复制一个列表,创建一个新的列表,新列表中的元素是原列表中元素的副本。在使用列表时,需要根据实际情况选择浅复制或深复制。