如何将元素副本添加到Python列表?

时间:2019-06-24 13:30:17

标签: python copy

我有一个看起来像这样的Python代码:

import random
import copy

symbols = set('ABC')
values = dict.fromkeys(symbols, [])

for i in range(5):
  value = random.randint(1, 100)
  if value % 3 == 0:
    values['A'].append(copy.deepcopy(value))
  elif value % 3 == 1:
    values['B'].append(copy.deepcopy(value))
  else:
    values['C'].append(copy.deepcopy(value))

print(values)
> {'B': [19, 31, 73, 9, 9], 'A': [19, 31, 73, 9, 9], 'C': [19, 31, 73, 9, 9]}

我希望字典的每个属性将具有不同的元素列表,但是我得到的最终结果是所有这些元素都具有相同的数字(如上所示)。尽管我使用deepcopy复制元素,为什么会发生这种情况?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您可以使用defaultdict来获得所需的结果。

from collections import defaultdict
import random

values = defaultdict(list)

for i in range(5):
  value = random.randint(1, 100)
  if value % 3 == 0:
    values['A'].append(value)
  elif value % 3 == 1:
    values['B'].append(value)
  else:
    values['C'].append(value)

print(values)

您无需复制value

defaultdict(list)会在每次首次访问字典中的键时创建一个新列表-因此您将在字典中拥有3个不同的对象作为值。