在 Python 中将多个列表添加到字典最终会覆盖以前的列表项?[复制]

Adding multiple lists to a dictionary in Python ends up overwriting previous list items? [duplicate]

提问人:xray911 提问时间:11/12/2023 更新时间:11/12/2023 访问量:59

问:

我对软件和 Python 比较陌生,我已经在这个问题上工作了几个小时。我也尝试过谷歌搜索,但无法找到问题的答案。

我有一本字典,里面有 3 个列表。这些列表包含两个值。我正在尝试用列表填充第二个字典,并将第一个字典中的列表中的值添加到某个项目的计算位置。

例如,第一个字典的第一个列表包含值 21 和 25。我计算的第一个位置是 100。现在,我希望我的第二个字典有一个值为 121 和 125 的列表。第二个列表项包含值 -21 和 -25。这应该会为第二个字典生成第二个列表,其值为 79 和 75。这个想法是第二个字典将包含 n 个位置 x 3 个列表 = 3n 个列表项。

我创建了 3 个与临时列表项嵌套在一起的 for 循环。我计算值,将 添加到临时列表,如果我完成了第一个列表,我会将它们添加到第二个字典中。

当我查看结果时,我发现代码符合我的预期。但看看结果,我看到了别的东西。看起来最后一个列表被放在 al 键上。print("adding" ,str(tempList), "with key", str(key))print(forbiddenAreas)

pitch = 100
numberItems = 3

forbiddenAreaItem = {
    "area1": [21, 25],
    "area2": [-21, -25],
    "area3": [12, 15]
}

forbiddenAreas = {}
tempList = []

if numberItems == 1:
    # print("There is one item")
    firstItemDistance = 0
else:
    # print("There are multiple items")
    firstItemDistance = ((numberItems / 2) - 0.5) * pitch

key = 1

for i in range(numberItems):
    itemLocation = firstItemDistance - pitch * i
    for y in forbiddenAreaItem:
        tempList.clear()
        for x in forbiddenAreaItem[y]:
            tempList.append(itemLocation + x)
        forbiddenAreas[key] = tempList
        print("adding" ,str(tempList), "with key", str(key))
        key += 1
print(forbiddenAreas)

我尝试在其他循环中切换,但无法生成有效的解决方案。我还尝试使用代替当前方法。forbiddenAreas[key] = tempListforbiddenAreas.update

python 列表 字典

评论

0赞 Jeff Mercado 11/12/2023
显然,您正在分享您所做的每一项更改。只需创建一个新实例即可。tempList
0赞 juanpa.arrivillaga 11/12/2023
您不断将相同的列表添加到字典中:.每个键都引用同一个列表forbiddenAreas[key] = tempListforbiddenAreas

答:

2赞 Gabriel Ramuglia 11/12/2023 #1

重用相同的 tempList 对象会使字典中的所有键都具有相同的值。

您应该在内部循环中创建一个新的 tempList,以便每个键都有自己的列表。

喜欢这个:

pitch = 100
numberItems = 3

forbiddenAreaItem = {
    "area1": [21, 25],
    "area2": [-21, -25],
    "area3": [12, 15]
}

forbiddenAreas = {}

if numberItems == 1:
    firstItemDistance = 0
else:
    firstItemDistance = ((numberItems / 2) - 0.5) * pitch

key = 1

for i in range(numberItems):
    itemLocation = firstItemDistance - pitch * i
    for y in forbiddenAreaItem:
        tempList = []
        for x in forbiddenAreaItem[y]:
            tempList.append(itemLocation + x)
        forbiddenAreas[key] = tempList
        print("adding", str(tempList), "with key", str(key))
        key += 1

print(forbiddenAreas)

评论

0赞 xray911 11/12/2023
谢谢。我还是不太明白。在我的代码版本中,将新计算的值添加到临时列表。当对区域列表中的所有项目完成此循环时,它会将列表写入字典。循环中的下一个循环我清除了 templist。因此,一旦它再次完成,templist 中就会有不同的内容,并且它具有不同的键。为什么字典中已添加的列表会发生变化?他们是否仍然与列表保持联系?for x in forbiddenAreaItem[y]:forbiddenAreasfor y in forbiddenAreaItem:for x in forbiddenAreaItem[y]forbiddenAreas