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
相关产品推荐
相关产品推荐

