如何使用嵌套for循环解决字典列表值重复覆盖问题
问题根因定位
你遇到的所有键值完全重复的现象,本质是Python对可变对象(列表、字典等)的赋值是内存引用传递,不是值拷贝:
你之前把
count_merge列表赋值给total_dict['A']时,字典存的不是这个列表的独立数据副本,是这个列表的内存地址。后续你复用同一个列表、用clear()清空、追加B的统计值时,直接修改了内存里这个列表本身的内容,对应指向同一个地址的A键的值也会同步被修改,最后所有键都指向同一个被反复修改的列表,自然会出现所有输出完全一致的情况,根本不是A的值被B覆盖。
针对性解决思路
- 调整列表的初始化位置:不要在Lotno循环的外部定义全局共用的
count_merge列表,把列表的新建动作挪到外层Lotno循环的内部,每处理一个新的Lotno就生成一个全新的、内存独立的空列表,从根源上避免不同Lotno的统计数据共用同一块内存。
对比常见的错误写法和修正写法:# 错误写法:列表定义在循环外,clear操作会修改原内存地址的内容 count_merge = [] total_dict = {} for lot in Lotno_list: count_merge.clear() # 内层循环统计文件数、追加到count_merge total_dict[lot] = count_merge # 存的是count_merge的内存引用# 修正写法:每个Lotno对应独立列表 total_dict = {} for lot in Lotno_list: count_merge = [] # 每次循环重新初始化,生成全新独立的列表对象 # 内层循环统计文件数、追加到当前count_merge total_dict[lot] = count_merge - 保留原有代码结构做快速修复:如果不想调整循环结构,只要在给字典赋值的时候,对当前统计的列表做一次值拷贝即可。因为列表里存的都是整数类型的统计值,直接做浅拷贝就够,不需要复杂的深拷贝操作。比如把赋值语句改成
total_dict[lot] = count_merge.copy(),或者total_dict[lot] = list(count_merge),这样字典里存的是当前列表的独立副本,后续你清空列表、追加新Lotno的统计值时,都不会影响已经存入字典的历史数据。 - 附加统计逻辑优化:统计一级子文件夹内的文件数量时,记得要过滤掉子文件夹本身的路径,只统计实际的文件类型,避免把嵌套的子文件夹也算成文件,导致统计值偏差。可以用
os.path.isfile()判断路径是否为文件,或者搭配glob的通配规则精确匹配文件。
内容的提问来源于stack exchange,提问作者Cris Jeon
相关产品推荐
相关产品推荐

