容器变量返回的python3值错误

时间:2019-06-04 13:40:28

标签: python-3.x dictionary

我遇到的代码未能达到我的期望。详细信息如下:

    a = ['name']
    b = [('name=cheng',),('name=huang',),('name=pan',)]
    Dict = {}
    c = []
    for i in range(0,3):
        for j in range(0,1):
            Dict[a[j]] = b[i][j]
            c.append(Dict)
    print(c)

>>> [{'name':'name=pan'},{'name':'name=pan'},{'name':'name=pan'}]

i应该是什么

>>> [{'name':'name=cheng'},{'name':'name=huang'},{'name':'name=pan'}]

那么您能告诉我如何解决此问题吗?

2 个答案:

答案 0 :(得分:5)

您要在原位置更改Dict的值,而不是每次都不创建新的字典。循环的每次迭代,都将Dict["name"]设置为等于b中的元素之一,然后将其附加到列表中。循环的下一次迭代将更改dict(意味着您附加到c的先前版本也将被更改)。结果是您的列表c填充了在循环的最后一次迭代中创建的字典的3个精确副本(在内存中完全相同的位置)。

您如何解决此问题?每次都制作一本新字典。

a = ['name']
b = [('name=cheng',),('name=huang',),('name=pan',)]
c = []
for i in range(0,3):
    for j in range(0,1):
        temp_dict = {a[j]: b[i][j]} 
        c.append(temp_dict)
print(c)

结果:

[{'name': 'name=cheng'}, {'name': 'name=huang'}, {'name': 'name=pan'}]

答案 1 :(得分:1)

对于循环的所有迭代,您都使用Dict的相同值。因此,所有词典都是相同的。列表中只有三本相同词典的副本。

如果将Dict = {}语句移入循环,它将得到修复。

a = ['name']
b = [('name=cheng',),('name=huang',),('name=pan',)]
c = []
for i in range(0,3):
    Dict = {}
    for j in range(0,1):
        Dict[a[j]] = b[i][j]
        c.append(Dict)
print(c)

或更多Pythonic:

keys = ['name']
values_list = [('name=cheng',), ('name=huang',), ('name=pan',)]

result = []

for values in values_list:
    result.append(dict(zip(keys, values)))

print(result)

这可以通过使用zip内置函数来完成,而该函数与[(x[i], y[i]) for i in range(min(len(x), len(y))]的作用相同,而无需跟踪索引或长度。

dict类可以从元组列表构建字典,这是此解决方案使用的方法。