在python中创建新词典:使用for_循环与使用deepcopy()的比较

在python中创建新词典:使用for_循环与使用deepcopy()的比较,python,python-3.x,Python,Python 3.x,我刚刚学会了如何使用for循环从另一个字典构建一个字典 但我可以使用深度复制功能实现同样的功能。而且deep-copy()似乎可以节省时间,而且更短 使用深度复制有什么缺点。深度复制在功能上不同于使用for循环,后者提供浅层复制。如果字典包含任何可变对象,例如列表,作为值,则更改列表中的元素会更改浅副本中的相应元素,但不会更改深副本中的相应元素: dic = {'1': [0, 1]} shallow_copy = dic.copy() from copy import deepcopy dee

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

但我可以使用深度复制功能实现同样的功能。而且
deep-copy()
似乎可以节省时间,而且更短


使用深度复制有什么缺点。

深度复制在功能上不同于使用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]}
(通过cycle创建副本dict的过程与dic.copy()基本相同)当然,深度复制通常较慢,因为它需要在所有嵌套级别复制所有元素,但在某些情况下,您确实希望初始dict中可变元素的更改不会影响副本-然后使用深度复制。如果dict中的所有值都是不可变的,则没有区别


UPD:(查看您的注释)注意字符串在Python中是不可变的。

TL;博士如果您知道存在可变值或无法排除这种可能性,请使用
copy.deepcopy
。如果它从不包含可变值,只需使用
dict.copy
方法即可


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

如果没有可变值(因此只有字符串、数字、元组、冻结集等),则只需使用
.copy
方法,因为浅拷贝就足够了:

或者将其传递给
dict
功能:

dct_copy = dict(dct)
但是,如果您的字典包含可变值,则不要将
用于循环
,因为
copy.deepcopy
总是更快,并负责递归数据结构和嵌套值:

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

有了循环,你最终可能无法复制所有内容。

这取决于:你的字典包含什么?有可变值吗?它确实包含可变值。这里是:mydict={'bed length':'2英尺长','bed price':'800磅'}我明白你的意思。但是在什么情况下,我应该使用循环而不是深度复制?如果您需要
copy.deepcopy
中未涵盖的某些行为。例如,如果您只想浅层复制值,而不是递归到这些值中:
{key,copy.copy(value)For key,value in the_dict.items()}
。这是一个一级的深度复制。这实际上取决于您拥有或想要的for循环行为。
dct = {1: [1,2,3,4], 2: [[1,2],[2,3]]}
from copy import deepcopy
dct_copy = deepcopy(dct)