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] = []
相关推荐
菜鸟的人工智能之路几秒前
极坐标气泡图:医学数据分析的可视化新视角
python·数据分析·健康医疗
菜鸟学Python1 分钟前
Python 数据分析核心库大全!
开发语言·python·数据挖掘·数据分析
小白不太白9503 分钟前
设计模式之 责任链模式
python·设计模式·责任链模式
喜欢猪猪8 分钟前
Django:从入门到精通
后端·python·django
糖豆豆今天也要努力鸭14 分钟前
torch.__version__的torch版本和conda list的torch版本不一致
linux·pytorch·python·深度学习·conda·torch
何大春30 分钟前
【弱监督语义分割】Self-supervised Image-specific Prototype Exploration for WSSS 论文阅读
论文阅读·人工智能·python·深度学习·论文笔记·原型模式
在下不上天39 分钟前
Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复
大数据·开发语言·python
SEVEN-YEARS42 分钟前
深入理解TensorFlow中的形状处理函数
人工智能·python·tensorflow
EterNity_TiMe_1 小时前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
Suyuoa1 小时前
附录2-pytorch yolov5目标检测
python·深度学习·yolo