我刚学会了如何使用for循环从另一个字典中构建字典。
但是我可以使用深拷贝功能实现相同的功能。 deep-copy()
似乎可以节省时间,而且更短。
使用深拷贝是否有任何缺点。
答案 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)
使用循环可能最终不会深入复制所有内容。