在python中创建新词典:使用for_loops与使用deepcopy()

时间:2016-12-19 00:39:51

标签: python python-3.x

我刚学会了如何使用for循环从另一个字典中构建字典。

但是我可以使用深拷贝功能实现相同的功能。 deep-copy()似乎可以节省时间,而且更短。

使用深拷贝是否有任何缺点。

2 个答案:

答案 0 :(得分:0)

深度复制在功能上与使用for循环不同,后者提供浅拷贝。如果字典包含任何可变对象(例如,列表)作为值,则更改列表中的元素会更改浅副本中的相应元素,但不会更深:

dic = {'1': [0, 1]}
shallow_copy = dic.copy()
from copy import deepcopy
deep_copy = deepcopy(dic)
dic['1'][0] = 1
shallow_copy
> {'1': [1, 1]}
deep_copy
> {'1': [0, 1]}

(通过循环创建复制dict与dic.copy()基本相同)当然,深拷贝通常较慢,因为它需要复制嵌套的所有级别的所有元素,但在某些情况下,你真的想要在初始字典中更改可变元素不会影响副本 - 然后使用deepcopy。如果dict中的所有值都是不可变的,则没有区别。

UPD :(看你的评论)注意字符串在Python中是不可变的。

答案 1 :(得分:0)

TL; DR;如果您知道有可变值或者您不能排除这种可能性,请使用copy.deepcopy。如果它从不包含可变值,只需使用dict.copy方法。

我之前评论过询问dict是否包含任何可变值。让我解释一下这个问题:

如果你没有可变值(所以只有字符串,数字,元组,frozensets等),那么只需使用.copy方法,因为浅层副本足够

dct = {1: 1, 'a': 'a')
dct_copy = dct.copy()

或将其传递给dict函数:

dct_copy = dict(dct)

但是,如果您的字典包含可变值,则不要使用for-loops,因为copy.deepcopy总是更快并且负责递归数据结构和嵌套值:

dct = {1: [1,2,3,4], 2: [[1,2],[2,3]]}
from copy import deepcopy
dct_copy = deepcopy(dct)

使用循环可能最终不会深入复制所有内容。