在python中创建新词典:使用for_循环与使用deepcopy()的比较
我刚刚学会了如何使用for循环从另一个字典构建一个字典 但我可以使用深度复制功能实现同样的功能。而且在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
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)