字典列表键赋值异常:修改单个元素致所有元素同步变更
为什么修改列表中一个字典的键值,所有字典都跟着变?
你遇到的这个问题,核心原因是Python里的字典属于可变对象——你在循环里反复添加的是同一个book字典的引用,而不是每次创建新的字典实例。
咱们拆解一下你的代码逻辑:
不管是用普通循环:
shelves = 2 book = {"id":""} dictionary_list = [] for counter in range(shelves): dictionary_list.append(book)
还是用列表推导式:
dictionary_list = [book for i in range(shelves)]
这两种写法本质完全一致——dictionary_list里的两个元素,其实都指向内存中同一个book字典对象。所以不管你修改dictionary_list[0]["id"]还是dictionary_list[1]["id"],都是在修改同一个字典,自然所有元素的结果都会同步变化。
解决方法:每次循环创建独立的字典实例
要让列表里的每个元素都是互不影响的独立字典,你需要在每次循环时生成新的字典,而不是复用同一个。这里有几种常用写法:
- 直接在循环内创建新字典:
shelves = 2 dictionary_list = [] for counter in range(shelves): dictionary_list.append({"id":""}) # 每次循环都新建一个字典
- 用列表推导式生成独立字典:
shelves = 2 dictionary_list = [{"id":""} for i in range(shelves)]
- 如果字典结构复杂,可用
copy()方法复制新实例:
shelves = 2 book = {"id":""} dictionary_list = [] for counter in range(shelves): dictionary_list.append(book.copy()) # 复制出全新的字典对象
这样修改其中一个字典的id时,就只会影响对应的元素了:
dictionary_list[0]["id"] = "apple" dictionary_list[1]["id"] = "orange" print(dictionary_list) # 输出 [{"id":"apple"}, {"id":"orange"}]
内容的提问来源于stack exchange,提问作者Aleister Tanek Javas Mraz
相关产品推荐
相关产品推荐

