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

Python二维字典赋值异常:新增元素覆盖已有值问题求助

问题:Python二维字典赋值时内层字典被覆盖

问题场景

以下代码试图生成一个包含数值字段统计信息的二维字典,但添加第二个内层字典时,第一个内层字典的值被覆盖,最终两个内层字典内容完全相同:

# 代码来自其他模块的变量
int_col = [1,3]

data = [['CJ', '20', 'Male', '20000'], \
        ['Auts', '21', 'Female', '25000'], \
        ['Lucy', '20', 'Female', '10000'], \
        ['Lily', '20', 'Female', '15000']]

header = ['Name', 'Age', 'Sex', 'Salary']

# 返回数据中数值型字段的统计字典
def stats():
    stats_dict = {}
    col_stats = {}

    # 遍历int_col
    for col in int_col:
        max_int = -1000000
        min_int = 1000000

        # 遍历data
        for row in data:
            # 将字符串转为整数(实际代码中实现方式不同)
            row[col] = int(row[col])
            if isinstance(row[col], int):

                if row[col] > max_int:
                    max_int = row[col]
                
                if row[col] < min_int:
                    min_int = row[col]

        # 填充内层字典
        col_stats["max"] = max_int
        col_stats["min"] = min_int

        # 将内层字典添加到外层字典
        stats_dict[header[col]] = col_stats
        
        print(stats_dict)
    return stats_dict


stats()

期望与实际结果

  • 期望输出:
    {'Age': {'max': 21, 'min': 20}, 'Salary': {'max': 25000, 'min': 10000}}
    
  • 实际输出:
    {'Age': {'max': 25000, 'min': 10000}, 'Salary': {'max': 25000, 'min': 10000}}
    

问题原因

Python中字典是可变对象,代码里col_stats仅在函数开头初始化一次,后续循环中修改的都是同一个字典的内容。外层字典stats_dict的两个键Age和Salary指向的是同一个col_stats字典的引用,因此第二次循环修改col_stats时,会覆盖第一次的内容,最终两个键对应的值完全相同。


解决方案

将内层字典col_stats = {}的初始化移到for col in int_col:的循环内部,每次循环都创建一个新的字典实例,确保每个外层键对应独立的内层字典:

# 代码来自其他模块的变量
int_col = [1,3]

data = [['CJ', '20', 'Male', '20000'], \
        ['Auts', '21', 'Female', '25000'], \
        ['Lucy', '20', 'Female', '10000'], \
        ['Lily', '20', 'Female', '15000']]

header = ['Name', 'Age', 'Sex', 'Salary']

# 返回数据中数值型字段的统计字典
def stats():
    stats_dict = {}

    # 遍历int_col
    for col in int_col:
        # 每次循环创建新的内层字典
        col_stats = {}
        max_int = -1000000
        min_int = 1000000

        # 遍历data
        for row in data:
            # 将字符串转为整数(实际代码中实现方式不同)
            row[col] = int(row[col])
            if isinstance(row[col], int):

                if row[col] > max_int:
                    max_int = row[col]
                
                if row[col] < min_int:
                    min_int = row[col]

        # 填充内层字典
        col_stats["max"] = max_int
        col_stats["min"] = min_int

        # 将内层字典添加到外层字典
        stats_dict[header[col]] = col_stats
        
        print(stats_dict)
    return stats_dict


stats()

运行修改后的代码,即可得到预期的二维字典结果。


内容的提问来源于stack exchange,提问作者CJ Coleman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:50:21