匹配数组元素后如何更新整个对象?赋值失效原因及修复方案
问题解析与修复方案
这事儿核心是Python里变量引用和对象赋值的区别,我给你拆解清楚:
为什么item['Id'] = 10可行?
当你用for item in data遍历列表时,item其实是一个指向列表中字典对象的引用。你通过item['Id'] = 10修改的是这个引用指向的原字典对象本身——列表里存的就是这个对象的引用,所以原列表自然会跟着更新。
为什么item = update无效?
当你执行item = update时,你只是把item这个变量的引用重新指向了update这个新的字典对象,但原列表里的那个旧字典对象根本没被碰过。列表存储的还是旧对象的引用,所以打印data时看起来完全没变化。
修复方法
有两种常用的靠谱方案:
方案1:用字典的update()方法修改原对象
直接把update里的键值对合并到原字典中,这样修改的是原对象本身,列表会同步更新:
data=[{"hostname":"a.example.com","Id":"1"},{"hostname":"b.example.com","Id":"2"},{"hostname":"c.example.com","Id":"1"},{"hostname":"d.example.com","Id":"1"}] update={"hostname":"c.example.com","Id":"10"} for item in data: if item['hostname'] == 'c.example.com': item.update(update) # 合并update的键值对到原字典 print(data)
方案2:通过索引直接替换列表元素
用enumerate()同时拿到索引和元素,直接把列表对应位置的元素换成update这个新字典:
data=[{"hostname":"a.example.com","Id":"1"},{"hostname":"b.example.com","Id":"2"},{"hostname":"c.example.com","Id":"1"},{"hostname":"d.example.com","Id":"1"}] update={"hostname":"c.example.com","Id":"10"} for index, item in enumerate(data): if item['hostname'] == 'c.example.com': data[index] = update # 直接替换列表对应位置的元素 print(data)
两种方案运行后都会输出你想要的结果:
[{'hostname': 'a.example.com', 'Id': '1'}, {'hostname': 'b.example.com', 'Id': '2'}, {'hostname': 'c.example.com', 'Id': '10'}, {'hostname': 'd.example.com', 'Id': '1'}]
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

