【问题标题】:Changing dictionary value in loop is not working in Python [duplicate]在循环中更改字典值在 Python 中不起作用 [重复]
【发布时间】:2017-11-22 14:42:52
【问题描述】:

考虑一下这个简单的 Python 字典,我想将所有值更改为 4:
d = {'a': 1, 'b': 2, 'c': 3}

我知道以下按预期方式工作:

for key, value in d.items():
    d[key] = 4
print(d)  # output: {'a': 4, 'b': 4, 'c': 4}

但是,这不是:

for key, value in d.items():
    value = 4
print(d)  # output: {'a': 1, 'b': 2, 'c': 3}

当我检查 d[key]value 的内置 id 函数的输出时,它们是相同的。

谁能解释为什么value = 4 不起作用?

【问题讨论】:

  • 因为它不应该工作。它只是将名称 value 重新绑定到值 4,但这与字典没有任何关系。
  • 我现在明白为什么它不起作用了。感谢您指出另一个问题。

标签: python dictionary


【解决方案1】:

当您使用 for key, value in d.items() 进行迭代时,keyvalue 变量实际上是您正在迭代的键和值的副本(不是那么简单,但足以解释此解释)。

直接更改它们不会修改字典本身。运行以下代码:

d = {'a': 1, 'b': 2, 'c': 3}

for key, value in d.items():
    print id(value)
    print id(d[key])
    value = 4
    print id(value)
    print id(d[key])
    print(d)  # output: {'a': 1, 'b': 2, 'c': 3}

给出以下输出:

10158424
10158424
10158352
10158424
{'a': 1, 'c': 3, 'b': 2}
10158376
10158376
10158352
10158376
{'a': 1, 'c': 3, 'b': 2}
10158400
10158400
10158352
10158400
{'a': 1, 'c': 3, 'b': 2}

如您所见,在修改value 之前,ID 是相同的。修改后,它们现在引用不同的值。

您的第一个示例以预期的方式更改实际字典,方法是使用键引用特定条目并对其进行修改。

【讨论】:

  • 那为什么id(d[key]) == id(value)返回True
  • 这就是为什么我说它不是那么简单:) 我看到问题已被标记为重复。其他问题/答案实际上解释了为什么您的陈述评估为True。我希望如果您在第二个示例中更改 value 后执行 id 检查,它将不再相同。
  • 你是对的。 id 更改后检查value 返回False。谢谢。
  • 哈,正忙着更新你评论的答案。
猜你喜欢
  • 2013-08-05
  • 2018-09-29
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
相关资源
最近更新 更多