【问题标题】:Trouble assigning value by key in list of dictionaries在字典列表中按键分配值时遇到问题
【发布时间】:2020-05-16 04:51:37
【问题描述】:

我有一个这样的字典列表:

dictionary_list = [{"id":""},{"id":""}]

编辑:由于意图是允许列表中的元素数量可变,因此列表实际上是以这种方式构建的:

shelves = 2
book = {"id":""}
dictionary_list = []
for counter in range(shelves):
    dictionary_list.append(book)

编辑:我还尝试了社区建议的以下方法:

shelves = 2
book = {"id":""}
dictionary_list = [book for i in range(shelves)]

我正在尝试将第一个元素的“id”分配给“apple”,如下所示:

dictionary_list[0]["id"] = "apple"

结果:

print dictionary_list
>> [{"id":"apple"},{"id":"apple"}]

当然,当我将"orange" 分配给dictionary_list[1]["id"] 时,两个id 都变为橙色。

这里发生了什么?谢谢!

【问题讨论】:

    标签: python string list python-2.7 dictionary


    【解决方案1】:

    发生这种情况是因为您已经像这样启动了您的字典:

    dictionary_list = [{"id":""}]*2
    

    或类似的。这实际上是对同一个字典的两个引用,因此当您更改一个字典的 id 键的值时,两者都会更改。这可以通过使用id()来检查:

    >>> id(dictionary_list[0])
    3055225778896
    >>> id(dictionary_list[1])
    3055225778896
    

    您可以通过像这样启动字典来解决此问题:

    dictionary_list = [{"id":""} for i in range(2)]
    

    编辑:

    给定新代码:

    shelves = 2
    book = {"id":""}
    dictionary_list = []
    for counter in range(shelves):
        dictionary_list.append(book)
    

    我们可以看到,每次 for 循环运行时,book 的相同引用都会附加到 dictionary_list。我们可以将其更改为如下工作:

    shelves = 2
    dictionary_list = []
    for counter in range(shelves):
        dictionary_list.append({"id":""})
    

    或者:

    shelves = 2
    book = {"id":""}
    dictionary_list = []
    for counter in range(shelves):
        dictionary_list.append(book.copy())
    

    【讨论】:

    • 感谢id() 的提示,但我现在尝试以几种方式定义我的字典,包括我添加到原始问题中的那个以及你描述的那个。我用id() 验证了这两种方法都创建了两个具有相同ID 的字典。多么不寻常。
    • @AleisterTanekJavasMraz 如所解释的那样,鉴于您在编辑中添加的代码,您正在将 book 字典的副本附加到您的列表中。当您编辑一个book 字典时,所有副本也会更改。
    【解决方案2】:

    您正在多次附加同一个图书对象。您需要每次在循环内创建 dict 对象或将 book.copy() 附加到列表中。

    这样

    for counter in range(shelves):
        dictionary_list.append(book.copy())
    

    或者像这样

    dictionary_list = [{"id":""} for counter in range(shelves)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 2021-07-09
      • 2016-02-09
      • 2021-08-04
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多