python-3.x - 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 中的可变对象。考虑一下:
>>> d = {'a': 1}
>>> d2 = d
>>> d
{'a': 1}
>>> d2
{'a': 1}
>>> d is d2
True
两者d
和d2
指的是同一个对象。您可以通过任一变量名称对字典进行更改,但由于它们都引用同一个对象,因此通过一个变量所做的更改可以通过另一个变量看到:
>>> 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]
推荐阅读
- c - C中的函数指针?
- javascript - 代码无法运行:Javascript&HTML 根据使用 if else 的多个下拉列表的选定值自动显示价格
- micronaut - 为什么在使用 Kotlin 数据类时在 Micronaut Data JDBC 中使用可为空的主键?
- python - 消息:没有这样的元素:无法找到元素:python 中的 {"method":"css selector","selector":"[id="username"]"} 错误
- css - 在 SVG 文件中,我的 CSS 隐藏文本不显示
- angular - 为什么我的删除功能在我的桌子上不起作用
- python - 如何在 Youtube Data API 中自动化 OAuth2.0?
- javascript - 触发器在 Windows 加载后无法附加无线电
- mysql - MySQL中与+字符匹配的整个单词
- linux - 如何配置 linux 以接收来自两个不同遥控器的信号?