【问题标题】:Pass dictionary to function without altering previously processed values将字典传递给函数而不更改先前处理的值
【发布时间】:2020-08-09 23:41:42
【问题描述】:

我正在尝试使用函数更改字典列表中的特定条目。但是,我不能在不更改所有条目的情况下更改一个条目。我已经尝试了我能想到的 dict() 和 .copy() 的所有组合,但我无法让它工作。我该如何解决这个问题?

a = dict(population[10][2])
b = a.copy()
print(a == b)
print(route_length(a))
print(route_length(b))

是的

(3, 0, 1, 1, 1, 1, 2, 2, 0, 0, 2, 0, 5, 4, 0, 1, 0, 0)

(3, 0, 1, 1, 1, 1, 2, 2, 0, 0, 2, 0, 5, 4, 0, 1, 0, 0)

c = dict(mutate(a))
print(route_length(c))

(2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 3, 0, 6, 4, 0, 2, 0, 0)

d = dict(mutate(b))
print(route_length(c))
print(route_length(d))

(3, 0, 0, 0, 0, 2, 1, 0, 1, 0, 3, 0, 7, 3, 0, 3, 0, 0)

(3, 0, 0, 0, 0, 2, 1, 0, 1, 0, 3, 0, 7, 3, 0, 3, 0, 0)

c == d

是的

我不期待“mutate”给出任何具体的答案,只是“c”和“d”不同。 'mutate' 随机重新排列一些列表,我的打印输出给出了不同列表的长度。我只是用来表明正在发生一些事情,并且每次都在发生不同的事情。

【问题讨论】:

  • 你能澄清一下预期的输入/输出是什么
  • 你能提供一个minimal reproducible example吗?包括数据(最小示例)。
  • mutate 在做什么?

标签: python dictionary copy deep-copy


【解决方案1】:

a.copy() 创建一个浅拷贝 - 将创建一个新的字典对象,并且对现有字典中对象的引用将插入到新字典中。

您需要的是深拷贝,它会递归地创建一个包含所有对象副本的新字典:

import copy
a = dict(population[10][2])
b = copy.deepcopy(a)

现在b中的任何修改都不会反映在a的原始副本中。

【讨论】:

  • 值得注意的是,这里需要深拷贝的原因是a 似乎包含可变对象,而函数mutate 会改变这些对象(不仅仅是列表)。这些细节都没有出现在原始问题中,因此值得为未来的读者澄清答案。
猜你喜欢
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 2022-01-15
  • 2021-03-30
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多