python for循环和字典

时间:2013-04-24 10:15:42

标签: python python-2.6 tryton

在python和tryton中 我很困惑为什么我不能得到我想要的理想价值;我不知道出了什么问题。

让我们说self.pendingapr有一个字段itemdescription并且有3个索引,总体而言small中有mediumlargeitemdescriptions。我真的不知道问题是否在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'}

3 个答案:

答案 0 :(得分:2)

您将同一个对象放入M2Mldic2字典中的每个值。请记住,对象通常通过引用传递,您需要在需要复制时显式复制它们。

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

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

答案 1 :(得分:1)

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

我认为你的代码应该是:

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

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

答案 2 :(得分:1)

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

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}