示例代码如下:
from copy import deepcopy
List = [range(3), range(3), range(3)]
a = deepcopy(List)
b = [each[:] for each in List]
我知道初始化 a 所需的时间比 b 的时间慢,但为什么会这样呢? deepcopy 和 [each[:] for each in List] 有什么区别?为什么 deepcopy 这么慢?
请您参考如下方法:
each[:] 创建每个嵌套列表的浅 副本。 copy.deepcopy() 将进行深度复制。
在这种特定情况下,您的嵌套列表包含不可变整数,这种差异实际上并不重要; deepcopy() 复制时返回整数不变。但是,如果嵌套列表中有可变对象,则 deepcopy() 将继续创建这些对象的副本,而您的列表理解不会。
例如,在复制包含带有字典的列表的列表时,您会看到不同之处:
>>> from copy import deepcopy
>>> sample = [[{'foo': 'bar'}, {'ham': 'spam'}], [{'monty': 'python'}, {'eric': 'idle'}]]
>>> shallow = [each[:] for each in sample]
>>> deep = deepcopy(sample)
>>> sample[-1][-1]['john'] = 'cleese'
>>> sample
[[{'foo': 'bar'}, {'ham': 'spam'}], [{'monty': 'python'}, {'eric': 'idle', 'john': 'cleese'}]]
>>> shallow
[[{'foo': 'bar'}, {'ham': 'spam'}], [{'monty': 'python'}, {'eric': 'idle', 'john': 'cleese'}]]
>>> deep
[[{'foo': 'bar'}, {'ham': 'spam'}], [{'monty': 'python'}, {'eric': 'idle'}]]
因为deepcopy()操作必须测试嵌套列表中的每个元素,所以它也比较慢;如果您知道不需要生成“更深层次”的副本,则列表理解是更好的选择。
