在 Python 中,复制列表有以下 5 种方式。其中前 4 种是浅拷贝,最后 1 种是深拷贝。
- 使用切片。
- 使用 list() 函数。
- 使用列表相乘。
- 使用 copy.copy()。
- 使用 copy.deepcopy()。
使用 “切片” 复制列表
在 Python 中,复制列表最简单的方式,就是使用 “切片” 这种方式。
示例 1:使用切片
colors = ['red', 'green', 'blue']
result = colors[:]
print(result)运行结果如下。
['red', 'green', 'blue']分析:
colors[:] 表示使用切片来截取 colors 中所有元素。
使用 list() 复制列表
很多初学的小伙伴只知道 list() 函数可以用于创建列表,实际上它还可以用来复制列表。
示例 2:使用 list()
colors = ['red', 'green', 'blue']
result = list(colors)
print(result)运行结果如下。
['red', 'green', 'blue']使用 “乘法” 复制列表
在 Python 中,列表可以与 “0” 或整数相乘。当列表与 “1” 相乘时,就相当于复制该列表。
示例 3:使用乘法
colors = ['red', 'green', 'blue']
result = colors * 1
print(result)运行结果如下。
['red', 'green', 'blue']提示: 列表与 “1” 相乘,实现的是浅拷贝,而不是深拷贝。
使用 copy.copy() 复制列表
在 Python 中,copy 模块提供了一个 copy() 函数来实现列表的浅复制(浅拷贝)。
示例 4:使用 copy.copy()
import copy
colors = ['red', 'green', 'blue']
result = copy.copy(colors)
print(result)运行结果如下。
['red', 'green', 'blue']使用 copy.deepcopy() 复制列表
在 Python 中,copy 模块提供了一个 deepcopy() 函数来实现列表的深复制(深拷贝)。
示例 5:使用 copy.deepcopy()
import copy
colors = ['red', 'green', 'blue']
result = copy.deepcopy(colors)
print(result)运行结果如下。
['red', 'green', 'blue']示例 6:copy.copy() 实现的是浅复制
import copy
nums = [1, 2, 3, [4, 5, 6]]
result = copy.copy(nums)
result[3].append(7)
print(nums)
print(result)运行结果如下。
[1, 2, 3, [4, 5, 6, 7]]
[1, 2, 3, [4, 5, 6, 7]]分析:
result[3].append(7) 表示获取 result 的第 4 个元素(即 [4, 5, 6]),然后在其末尾追加一个元素 7,此时 result 第 4 个元素就会变为 [4, 5, 6, 7],然后 result 的值就会变为:[1, 2, 3, [4, 5, 6, 7]]。
但是从结果可以看出,在改变 result 的同时,nums 也跟着改变了。也就是意味着 copy.copy() 实现的本质上是一个浅拷贝。简单来说就是,只会拷贝列表的第一层。
示例 7:copy.deepcopy() 实现的是深复制
import copy
nums = [1, 2, 3, [4, 5, 6]]
result = copy.deepcopy(nums)
result[3].append(7)
print(nums)
print(result)运行结果如下。
[1, 2, 3, [4, 5, 6]]
[1, 2, 3, [4, 5, 6, 7]]分析:
这里使用的是 copy.deepcopy(),从结果可以看出,虽然修改了列表第二层的内容,但却不会影响原列表。也就是说,copy.deepcopy() 实现的是深拷贝。
深拷贝与浅拷贝
在真实的项目开发中,深拷贝与浅拷贝经常会看到,它们之间的区别如下。不过小伙伴们应该清楚的是,更多情况下使用的是深拷贝,而不是浅拷贝。
- 浅拷贝:如果是值类型,那么会复制它的值;如果是引用类型,则会复制它的引用。
- 深拷贝:不管是值类型还是引用类型,都只是复制它的值。
