You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

for循环填充字典时所有键值被覆盖,错误原因及解决方法

问题描述

我有一个转置后的Dataframe tr:

712887191405114636
JDUTC_02451957.362452149.362457243.982452531.89
JDUTC_12451957.372452149.362457243.992452531.90
JDUTC_22451957.372452149.362457244.002452531.91
JDUTC_3NaN2452149.36NaNNaN
JDUTC_4NaN2452149.36NaNNaN
JDUTC_5NaN2452149.36NaNNaN
JDUTC_61.232452149.37NaNNaN
JDUTC_7NaNNaNNaNNaN
JDUTC_8NaNNaNNaNNaN
JDUTC_9NaNNaNNaNNaN

我通过以下代码创建字典a:

a = {}
b=[]
for _, contents in tr.items():
    b.clear()
    for ind, val in enumerate(contents):
        if np.isnan(val):
            b.append(ind)
            continue
        else:
            pass
    print(_)
    print(b)
    a[_] = b
    print(a)

运行后得到如下输出:

7128
[3, 4, 5, 7, 8, 9]
{7128: [3, 4, 5, 7, 8, 9]}
8719
[7, 8, 9]
{7128: [7, 8, 9], 8719: [7, 8, 9]}
14051
[3, 4, 5, 6, 7, 8, 9]
{7128: [3, 4, 5, 6, 7, 8, 9], 8719: [3, 4, 5, 6, 7, 8, 9], 14051: [3, 4, 5, 6, 7, 8, 9]}
14636
[3, 4, 5, 6, 7, 8, 9]
{7128: [3, 4, 5, 6, 7, 8, 9], 8719: [3, 4, 5, 6, 7, 8, 9], 14051: [3, 4, 5, 6, 7, 8, 9], 
14636: [3, 4, 5, 6, 7, 8, 9]}

我预期字典a的结构为:

{7128: [3, 4, 5, 7, 8, 9],
 8719: [7, 8, 9],
14051: [3, 4, 5, 6, 7, 8, 9],
14636: [3, 4, 5, 6, 7, 8, 9]}

请问我哪里出错了?为什么a[_] = b会覆盖之前所有键的值,而print(_)已经验证_始终是下一个列标签?


问题原因与解决方法

错误原因

核心问题是列表的引用传递特性:

  • 你只创建了一个全局列表b,每次循环用b.clear()清空后重新添加元素,本质上始终在操作同一个列表对象。
  • 字典a中所有键存储的都是这个列表b的引用,而非独立的副本。所以每次修改b的内容,字典里所有已存入的列表都会同步变化,最终所有键的值都会变成最后一次循环中b的内容。

修正方法

不要复用同一个列表,每次循环创建新的列表对象即可:

a = {}
for _, contents in tr.items():
    b = []  # 每次循环新建列表,替代复用旧列表
    for ind, val in enumerate(contents):
        if np.isnan(val):
            b.append(ind)
    print(_)
    print(b)
    a[_] = b
    print(a)

或者用更简洁的列表推导式写法:

import numpy as np
a = {col: [i for i, val in enumerate(tr[col]) if np.isnan(val)] for col in tr.columns}

这样每个字典键都会对应独立的列表,不会出现值被覆盖的问题。

内容的提问来源于stack exchange,提问作者Jonathan Sullivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:45:31