【问题标题】:Mystery of Dictionaries and For loop in Python 3Python 3 中的字典和 For 循环之谜
【发布时间】:2020-07-05 09:33:11
【问题描述】:

我有一本字典:

dog = {'color': 'black'}

我在一个列表中创建了 3 条相似的狗:

dogs = []
dog = {'color': 'black'}
for num in range(3):
   dogs.append(dog)

当我尝试修改我的狗列表中的第一只狗时:

dogs[0]['color'] = 'white'

它检索我整个列表已修改:

[{'color': 'white'}, {'color': 'white'}, {'color': 'white'}]

但是当我在 for 循环中声明我的狗字典并尝试更改单只狗字典时:

for num in range(3):
 dog = {'color': 'black'}
 dogs.append (dog)

 dogs[0]['color'] = 'white'

我得到了想要的输出:

[{'color': 'white'}, {'color': 'black'}, {'color': 'black'}]

【问题讨论】:

  • 你自己说,在第一种情况下你有一本字典。在第二种情况下,您创建三个单独的字典。您没有创建 “3 条相似的狗”,您添加了三个对完全相同对象的引用。
  • 对于列表也是如此 - 在您的第一种情况下,如果 dog 是一个列表,dogs 将是对单个相同列表的引用列表。
  • 看起来你的狗应该是一个类,可以实例化。
  • 是的,就是这样。 问题是什么?
  • 阅读以下内容:nedbatchelder.com/text/names.html

标签: python loops dictionary for-loop output


【解决方案1】:

区别在于第一个例子中

dogs = []
dog = {'color': 'black'}
for num in range(3):
   dogs.append(dog)
dogs[0]['color'] = 'white'

狗列表中的每只狗都引用同一个狗字典,并通过更改字典的颜色来反映同一个对象。
在第二个代码中

for num in range(3):
    dog = {'color': 'black'}
    dogs.append (dog)

dogs[0]['color'] = 'white'

在每次迭代中,都会创建一个新的字典对象,因此通过将每个对象添加到列表中,列表项对字典对象的引用是不同的,因此,如果您要更改列表中特定项的颜色它只会改变他的价值。

【讨论】:

    【解决方案2】:

    在您的第一个示例中,您总是附加相同的对象/相同的狗。

    在第二个示例中,您将附加三个不同的对象,因为您在循环中创建它们。

    如果您想附加您的狗的副本,只需执行以下操作:

    dogs = []
    dog = {'color': 'black'}
    for num in range(3):
       dogs.append(dog.copy())
    

    请注意,在这种情况下,原始狗不是您的狗列表的一部分,只是它的副本。

    编辑:如果你的字典是嵌套的,你需要 .deepcopy() --> https://stackoverflow.com/a/2465951/13450078

    【讨论】:

      猜你喜欢
      • 2019-07-07
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      相关资源
      最近更新 更多