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] = []
相关推荐
wzhidev17 分钟前
04、Python核心数据类型详解:从一段诡异的调试说起
开发语言·python
wzhidev19 分钟前
05、Python流程控制与函数定义:从调试现场到工程实践
linux·网络·python
Thomas.Sir19 分钟前
第十一章:深入剖析 Prompt 提示工程
python·prompt
Fortune7920 分钟前
用Pandas处理时间序列数据(Time Series)
jvm·数据库·python
2401_8785302125 分钟前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
2401_8735449229 分钟前
使用Black自动格式化你的Python代码
jvm·数据库·python
Fortune7931 分钟前
用Python破解简单的替换密码
jvm·数据库·python
码码哈哈0.035 分钟前
某音评论采集代码分析(基于 Playwright)文末附成品下载
python
Chase_______40 分钟前
【2026最新保姆级】Python 安装与PyCharm安装配置指南 (Window版)
开发语言·python·pycharm
创世宇图43 分钟前
Python跨平台文字转语音:调用系统原生引擎实现实时朗读
python