如何提取和编辑字典值而不对字典本身进行编辑?

23 浏览
0 Comments

如何提取和编辑字典值而不对字典本身进行编辑?

这个问题在这里已经有了答案

如何克隆一个列表,以便在赋值后不会出现意外更改?

如何复制字典并仅编辑副本

我有一个字典,其中键是字母,值是数组。我想提取其中一个数组,然后从中弹出一个值,而不更改字典。

mydict = {'a': ['apple', 'avocado'], 
          'b': ['banana', 'berry'], 
          'c': ['carrot', 'cucumber']}
fruits = mydict['a']
fruits.pop(0)

当我打印字典时,我会得到:

>> {'a': ['avocado'], 'b': ['banana', 'berry'], 'c': ['carrot', 'cucumber']}

我如何获得一个不会在弹出时更改字典的列表副本?

admin 更改状态以发布 2023年5月23日
0
0 Comments

=操作符可以创建新的变量或数据结构,但实际上它只是指向之前的同一对象。因此,使用=操作符是行不通的。

您可以使用list.copy()方法,它返回字典中列表的浅拷贝。修改此列表不会修改原始字典。

mydict = {'a': ['apple', 'avocado'], 
          'b': ['banana', 'berry'], 
          'c': ['carrot', 'cucumber']}
fruits = mydict['a'].copy()
fruits.pop(0)
print(fruits) # returns ['avocado']
print(mydict) # returns {'a': ['apple', 'avocado'] ...}

或者,使用Python copy模块的copy()deepcopy()方法都可以。

import copy
mydict = {'a': ['apple', 'avocado'], 
          'b': ['banana', 'berry'], 
          'c': ['carrot', 'cucumber']}
fruits = copy.copy(mydict['a']) # or copy.deepcopy(mydict['a'])
fruits.pop(0)
print(fruits) # returns ['avocado']
print(mydict) # returns {'a': ['apple', 'avocado'] ...}

浅拷贝(copy()方法)和深拷贝(deepcopy()方法)之间的区别很重要,但在这种情况下并不真正适用,因为您不是拷贝嵌套数据结构(您的字典),而只是字典中的一个列表。

例如,浅拷贝字典并修改嵌套列表也会修改原始字典:

import copy
mydict = {'a': ['apple', 'avocado'], 
          'b': ['banana', 'berry'], 
          'c': ['carrot', 'cucumber']}
fruits = copy.copy(mydict)
fruits['a'].append('apricot') # also changes mydict
print(fruits) # returns {'a': ['apple', 'avocado', 'apricot'] ...}
print(mydict) # also returns {'a': ['apple', 'avocado', 'apricot'] ...}

而深拷贝则不会:

import copy
mydict = {'a': ['apple', 'avocado'], 
          'b': ['banana', 'berry'], 
          'c': ['carrot', 'cucumber']}
fruits = copy.deepcopy(mydict)
fruits['a'].append('apricot') # also changes mydict
print(fruits) # returns {'a': ['apple', 'avocado', 'apricot'] ...}
print(mydict) # returns {'a': ['apple', 'avocado'] ...}

来自Python 3文档的copy模块:

浅拷贝和深拷贝之间的区别仅适用于复合对象(包含其他对象,如列表或类实例的对象):

  • 浅拷贝构造一个新的复合对象,然后(尽可能地)将引用插入其中,指向原始对象中找到的对象。

  • 深拷贝构造一个新的复合对象,然后递归地插入原始对象中找到的对象的副本。

0
0 Comments

在赋值fruit变量时,使用.copy()属性。

>>> mydict = {'a': ['apple', 'avocado'], 
              'b': ['banana', 'berry'], 
              'c': ['carrot', 'cucumber']}
>>> fruits = mydict['a'].copy()
>>> fruits.pop(0)

这将得到以下结果。

>>> mydict
{'a': ['apple', 'avocado'],
 'b': ['banana', 'berry'],
 'c': ['carrot', 'cucumber']}
>>> fruits
['avocado']

0