Pytho 从列表中创建字典 (dict.fromkeys()的问题)

问题起因:想在代码中通过已有的列表创建一个字典,但是又不想写循环,更不想手动填,所以用到了字典对象的fromkeys()方法 。

先以一个简单的例子介绍一下该方法:

python 复制代码
a = ["A", "B", "C", "D"]
# 我们想创建一个以列表A中元素为键的字典b, 那么可以这样写
b = dict.fromkeys(a, 0)      # 显式地指定字典中所有键的值都为0
b = dict.fromkeys(a)         # 使用默认的值,即为None

如果我们的代码中也是这种简单的情况,那就没有接下来的问题了,But,不是。

在我的代码中,假设我想创建的字典b的键来自于列表a, 每个键所对应的默认值我想设置为一个空列表:[],所以代码可以表示为:

python 复制代码
a = ["A", "B", "C", "D"]
b = dict.fromkeys(a, [])
print(b)  # 输出结果为:{'A': [], 'B': [], 'C': [], 'D': []}

从输出结果来看,我们的代码似乎没有毛病。但是真正往列表中添加数据的时候出现了问题,请看下面例子:

python 复制代码
b["A"].append("xxx")         # 向b["A"]这个列表中添加一个字符串 "xxx"
print(b)  # 输出结果为:{'A': ['xxx'], 'B': ['xxx'], 'C': ['xxx'], 'D': ['xxx']}

所有的键值对中的值都改变了,都变成了["xxx"], 就好像它们是同一个列表一样。为了进一步探究,我们可以使用id()函数获取这些列表的地址,如果地址一样,则说明它们是同一个列表,所以操作一个就代表操作所有。

python 复制代码
print(id(b["A"]))   # 输出结果:2969028980160
print(id(b["B"]))   # 输出结果:2969028980160
print(id(b["C"]))   # 输出结果:2969028980160
print(id(b["D"]))   # 输出结果:2969028980160

它们的输出结果完全一致,可见对于列表这个可变类型,fromkeys()函数只是复制了列表的引用,作为默认值。如果想把值初始化为列表,并且后续会进行数据存取操作,那还是建议动动手,写个循环。

就像这样, 这次列表的地址就都不一样了:

python 复制代码
for key in a:
    a[key] = []
相关推荐
空中湖9 分钟前
PyTorch武侠演义 第一卷:初入江湖 第7章:矿洞中的计算禁制
人工智能·pytorch·python
Emma歌小白23 分钟前
**大数据量(几千万行)划分价格区间(价格段)
python
马哥python说1 小时前
【效率软件】抖音转换工具:主页链接和抖音号一键批量互转
爬虫·python
江山如画,佳人北望1 小时前
pytorch常用函数
人工智能·pytorch·python
这里有鱼汤1 小时前
首个开源金融平台,一站式数据终端 + AI 代理,量化研究者的利器,速来白嫖
后端·python
这里有鱼汤1 小时前
Python量化实战:如何用Python实现查找相似K线,附源码,建议收藏
后端·python
小阿鑫1 小时前
使用 Kiro AI IDE 3小时实现全栈应用Admin系统
前端·后端·python·admin·kiro·next admin·fastapi admin
Blossom.1181 小时前
基于深度学习的医学图像分析:使用YOLOv5实现细胞检测
人工智能·python·深度学习·yolo·机器学习·分类·迁移学习
啊阿狸不会拉杆2 小时前
《Java 程序设计》第 8 章 - Java 常用核心类详解
java·开发语言·python·算法·intellij-idea
小白学大数据2 小时前
Python + Requests库爬取动态Ajax分页数据
开发语言·python·ajax·okhttp