鱼C论坛

 找回密码
 立即注册
查看: 1697|回复: 9

[已解决]python中字典中列表作为值append问题

[复制链接]
发表于 2017-12-12 10:45:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如下列代码,我设置一个字典为 dic = {1: [], 2: [], 3: [], 4: [], 5: []},给dic[1]进行append操作,却发现系统对所有dic下的键对应的list进行了append操作,用setdefault还是一样对所有键对应的list进行了操作,这种情况该怎么解决呢【运行环境为Python3.6.3】

>>> a = [1,2,3,4,5]
>>> dic = {}.fromkeys(a,[])
>>> dic
{1: [], 2: [], 3: [], 4: [], 5: []}
>>> dic[1].append("m")
>>> dic
{1: ['m'], 2: ['m'], 3: ['m'], 4: ['m'], 5: ['m']}
>>> dic[1]
['m']
>>> dic[2]
['m']
>>> lis = dic[1]
>>> lis.append("n")
>>> dic
{1: ['m', 'n'], 2: ['m', 'n'], 3: ['m', 'n'], 4: ['m', 'n'], 5: ['m', 'n']}
>>> dic.setdefault(1,[]).append("k")
>>> dic
{1: ['m', 'n', 'k'], 2: ['m', 'n', 'k'], 3: ['m', 'n', 'k'], 4: ['m', 'n', 'k'], 5: ['m', 'n', 'k']}
>>>
最佳答案
2017-12-12 11:22:12
跟版本无关
因为fromkeys的操作中你用一个空列表作为每一个键的值
此时系统为了节约开销,不会自动给你生成那么多的列表,而是用一个同一个列表
所以你用列表的操作函数会影响所有的键对应的值

解决方案可以不用fromkeys,比如
  1. >>> dic2={1:[],2:[],3:[]}
  2. >>> dic2[1].append('m')
  3. >>> dic2
  4. {1: ['m'], 2: [], 3: []}
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-12-12 10:56:50 | 显示全部楼层
我的Python3.7
可以实现
QQ截图20171212105554.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-12 11:11:43 From FishC Mobile | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-12 10:56
我的Python3.7
可以实现

我我用的3.6.3,您知道在3.6.3下有别的办法实现这个结果吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-12 11:18:14 | 显示全部楼层
RSF45355382 发表于 2017-12-12 11:11
我我用的3.6.3,您知道在3.6.3下有别的办法实现这个结果吗

我觉得3.63应该也可以实现的,都是python3版本,不会有什么大的改动才对。你再试一遍看看。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-12 11:19:59 | 显示全部楼层
不用fromkeys来创建就是了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-12 11:22:12 | 显示全部楼层    本楼为最佳答案   
跟版本无关
因为fromkeys的操作中你用一个空列表作为每一个键的值
此时系统为了节约开销,不会自动给你生成那么多的列表,而是用一个同一个列表
所以你用列表的操作函数会影响所有的键对应的值

解决方案可以不用fromkeys,比如
  1. >>> dic2={1:[],2:[],3:[]}
  2. >>> dic2[1].append('m')
  3. >>> dic2
  4. {1: ['m'], 2: [], 3: []}
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-12 11:22:14 | 显示全部楼层
直接创建的字典{}可以使用成功,用fromkeys创建的不行
估计是因为创建字典的时候使用是列表,是引用地址。所以修改的时候直接修改了引用地址。(不确定!!!!)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-12 11:23:21 From FishC Mobile | 显示全部楼层
ba21 发表于 2017-12-12 11:19
不用fromkeys来创建就是了。

我试了一下果然是fromkeys的问题,这个方法比较好用,所以就经常这么用了,看来以后还要注意啊,谢谢前辈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-12 11:23:56 From FishC Mobile | 显示全部楼层
colinshi 发表于 2017-12-12 11:22
直接创建的字典{}可以使用成功,用fromkeys创建的不行
估计是因为创建字典的时候使用是列表,是引用地址。 ...

嗯嗯,的确是这个问题,谢谢前辈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-12 11:24:56 From FishC Mobile | 显示全部楼层
BngThea 发表于 2017-12-12 11:22
跟版本无关
因为fromkeys的操作中你用一个空列表作为每一个键的值
此时系统为了节约开销,不会自动给你生 ...

嗯嗯,受教啦,感谢前辈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-4 17:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表