Python 复制列表

在 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() 实现的是深拷贝。

深拷贝与浅拷贝

在真实的项目开发中,深拷贝与浅拷贝经常会看到,它们之间的区别如下。不过小伙伴们应该清楚的是,更多情况下使用的是深拷贝,而不是浅拷贝。

  • 浅拷贝:如果是值类型,那么会复制它的值;如果是引用类型,则会复制它的引用。
  • 深拷贝:不管是值类型还是引用类型,都只是复制它的值。

上一篇: Python 合并列表

下一篇: Python 遍历列表

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号