首页 > 解决方案 > for循环中列表中的所有元素都相同

问题描述

我正在编写一个函数来将一个值列表迭代到另一个包含字典的列表中,但最后我得到了一个重复值的列表。

def createlayer():
    layerdxf = {"2": "",
                "70": "64",
                "62": "0",
                "6": "CONTINUOUS"}
    lr = ['grey', 'green', 'red', 'orange']
    lrys = []
    for la in lr:
        layerdxf.update({'2': la})
        el = {"LAYER": layerdxf}
        lrys.append(el)
    return lrys

函数返回:

[
{'LAYER': {'2': 'orange', '70': '64', '62': '0', '6': 'CONTINUOUS'}},
{'LAYER': {'2': 'orange', '70': '64', '62': '0', '6': 'CONTINUOUS'}},
{'LAYER': {'2': 'orange', '70': '64', '62': '0', '6': 'CONTINUOUS'}},
{'LAYER': {'2': 'orange', '70': '64', '62': '0', '6': 'CONTINUOUS'}}
]

什么时候应该返回:

[
{'LAYER': {'2': 'grey', '70': '64', '62': '0', '6': 'CONTINUOUS'}},
{'LAYER': {'2': 'green', '70': '64', '62': '0', '6': 'CONTINUOUS'}},
{'LAYER': {'2': 'red', '70': '64', '62': '0', '6': 'CONTINUOUS'}},
{'LAYER': {'2': 'orange', '70': '64', '62': '0', '6': 'CONTINUOUS'}}
]

谢谢,

JA

标签: python-3.xlistfor-loop

解决方案


字典是 Python 中的可变对象。考虑一下:

>>> d = {'a': 1}
>>> d2 = d
>>> d
{'a': 1}
>>> d2
{'a': 1}
>>> d is d2
True

两者dd2指的是同一个对象。您可以通过任一变量名称对字典进行更改,但由于它们都引用同一个对象,因此通过一个变量所做的更改可以通过另一个变量看到:

>>> d['b'] = 2
>>> d2
{'a': 1, 'b': 2}

所以这就是您的代码中发生的事情,但是,您拥有引用同一对象的列表元素,而不是多个变量引用同一个对象。因此,所有列表元素都可以看到对字典的最后修改(将颜色设置为橙色)。

要修复它,请复制字典。对于这样一个简单的字典,您可以dict.copy()在更新字典之前使用:

for la in lr:
    d = layerdxf.copy()
    d.update({'2': la})
    lrys.append({"LAYER": d}) 

另一种更简洁的方法是使用列表推导:

def createlayer():
    lr = ['grey', 'green', 'red', 'orange']
    return [{"2": la, "70": "64", "62": "0", "6": "CONTINUOUS"} for la in lr]

推荐阅读