【问题标题】:python for loop and dictionarypython for循环和字典
【发布时间】:2026-01-18 00:40:01
【问题描述】:

在 python 和 tryton 中 我很困惑为什么我不能得到我想要的价值;不知道怎么回事。

假设self.pendingapr 有一个字段itemdescription 并有3 个索引,总体而言它在itemdescriptions 中有smallmediumlarge。我真的不知道问题是否出在 for 循环中:

global M2Mdic
global M2Mldic2
M2Mdic = {}
M2Mldic2 = {}
res = {}

for x in self.pendingapr:
    M2Mdic['itemdescription'] = str(x.itemdescription)
    M2Mldic2[x.id] = M2Mdic

当我打印 M2Mldic2 时,它给了我

>>> {1:'large',2:'large',3:'large'}

当我需要/并且期待是

>>> {1:'small',2:'medium',3:'large'}

【问题讨论】:

  • 您好,感谢您的所有回答,这让我的心情豁然开朗。实际上,您的所有答案都值得检查。但我不能..所以我对你的回复进行排名。谢谢!

标签: python python-2.6 tryton


【解决方案1】:

您将相同的对象放入M2Mldic2 字典中的每个值中。请记住,对象通常是通过引用传递的,您需要在需要副本时明确地复制它们。

for x in self.pendingapr:
    M2Mdic = {
        'itemdescription': str(x.itemdescription)
    }
    M2Mldic2[x.id] = M2Mdic

这将为M2Mldic2 中的每个值创建一个单独的字典。

【讨论】:

  • 完全不需要M2Mdic!!
【解决方案2】:

正在发生的事情是地图变量是 Python 中的引用。因此,在每次迭代中,如果您正在修改所有 M2Mldic2 映射,因为它们都是相同的。

我认为你的代码应该是:

#global M2Mdic
global M2Mldic2
M2Mdic = {}
M2Mldic2 = {}
res = {}

for x in self.pendingapr:
   M2Mdic = {}
   M2Mdic['itemdescription'] = str(x.itemdescription)
   M2Mldic2[x.id] = M2Mdic

【讨论】:

    【解决方案3】:

    为什么你需要中间字典?这完全是多余的

    M2mDict={}
    for x in self.pendingapr:
        M2Mldic2[x.id] = str(x.itemdescription)
    

    或更多 Pythonic 方式(来自 v.2.7)

    M2mDict= = {x.id : str(x.itemdescription) for  x in self.pendingapr}
    

    【讨论】: