详解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
中的元素。由于list1
和list2
引用同一个列表对象,所以修改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
中的元素。由于list1
和list2
是独立的,所以修改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_list1
和new_list2
。然后,我们修改了原列表中的元素[4, 5, 6]
的第一个元素为100
。最后,我们输出了原列表和新列表,发现浅复制的新列表和原列表中的元素指向同一个内存地址,所以修改原列表中的元素也会影响新列表中的元素;而深复制的新列表和原列表中的元素不是同一个内存地址,所以修改原列表中的元素不会影响新列表中的元素。
总结
在Python中,列表的复制有两种方式:浅复制和深复制。浅复制是指复制一个列表,创建一个新的列表,但是新列表中的元素是原列表中元素的引用;深复制是指复制一个列表,创建一个新的列表,新列表中的元素是原列表中元素的副本。在使用列表时,需要根据实际情况选择浅复制或深复制。