解决python字典对值(值为列表)赋值出现重复的问题


Posted in Python onJanuary 20, 2019

可能很少有人遇到这个问题,网上也没找到,这里记录一下,希望也可以帮到其他人。

问题描述:假设有一个字典data,其键不定,可能随时添加键(这不是关键),某一个键下面对应的值为一个长度为10的list,初始化为0,然后我想修改某些键下面的列表中的某一个值,比如data有一个键'k',对应的值为[0,0,0,0,0,0,0,0,0,0],现在我想把键'k'对应的列表的第三个数改成3,即[0,0,3,0,0,0,0,0,0,0],可是意外的事情发生了,如果data还有一个键'k1',假设其值为[0,0,0,0,0,0,0,0,0,0],但是我操作完之后,居然也跟着变成了[0,0,3,0,0,0,0,0,0,0]。

具体代码如下:

data = {}
indexes = ['new','repeat']
ret = [{'i':1,'new':3,'repeat':11},{'i':3,'new':2,'repeat':6},
    {'i':4,'new':9,'repeat':2},{'i':9,'new':1,'repeat':8}]
y_axis = [0]*10
for e in ret:
  for index in indexes:
    if not data.has_key(index):
      data[index] = y_axis
  i = e['i']
  for index in indexes:
    data[index][i] = e[index]
print data

代码不难看懂,我感觉理论上应该输出:{'new': [0, 3, 0, 2, 9, 0, 0, 0, 0, 1], 'repeat': [0, 11, 0, 6, 2, 0, 0, 0, 0, 8]},但是事与愿违,输出是:{'new': [0, 11, 0, 6, 2, 0, 0, 0, 0, 8], 'repeat': [0, 11, 0, 6, 2, 0, 0, 0, 0, 8]},感觉莫名其妙,于是准备调试,先import pdb,再在需要打断点的前一句加pdb.set_trace()即可,如下:

import pdb
data = {}
indexes = ['new','repeat']
ret = [{'i':1,'new':3,'repeat':11},{'i':3,'new':2,'repeat':6},
    {'i':4,'new':9,'repeat':2},{'i':9,'new':1,'repeat':8}]
y_axis = [0]*10
for e in ret:
  for index in indexes:
    if not data.has_key(index):
      data[index] = y_axis
  i = e['i']
  for index in indexes:
    pdb.set_trace()
    data[index][i] = e[index]
print data

接着,python test.py,到赋值data的键对应的列表某一个值那一句:

解决python字典对值(值为列表)赋值出现重复的问题

查看data和index值:

解决python字典对值(值为列表)赋值出现重复的问题

正常。往下执行一步,即执行赋值操作,再查看data值:

解决python字典对值(值为列表)赋值出现重复的问题

在这里真想来一句mdblgl,明明index是'new',明明是对data['new'][1]赋值,关data['repeat'][1]屁事,它跟着变什么?可想而知,后面对data['repeat'][1]再赋一个值11,那'new'的值不就也跟着一起变,结果就是得到了最后那个莫名其妙的结果。

试过很多办法,想过很多原因,无赖才疏学浅,不知道是什么原理,最后,只好用一种非常笨的方法解决了:

data = {}
indexes = ['new','repeat']
ret = [{'i':1,'new':3,'repeat':11},{'i':3,'new':2,'repeat':6},
    {'i':4,'new':9,'repeat':2},{'i':9,'new':1,'repeat':8}]
y_axis = [0]*10
tmp = y_axis*len(indexes)
for k in range(len(indexes)):
  for e in ret:
    i = e['i']
    tmp[i+len(y_axis)*k] = e[indexes[k]]
for k in range(len(indexes)):
  data[indexes[k]] = tmp[(k*len(y_axis)):((k+1)*len(y_axis))]
print data

在此,希望知道为什么这样的大佬指点一下,万分感谢!

以上这篇解决python字典对值(值为列表)赋值出现重复的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python3 操作符重载方法示例
Nov 23 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
Mar 15 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
Python根据文件名批量转移图片的方法
Oct 21 Python
利用Python实现手机短信监控通知的方法
Jul 22 Python
Python交互式图形编程的实现
Jul 25 Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 Python
详解Python利用random生成一个列表内的随机数
Aug 21 Python
python线程的几种创建方式详解
Aug 29 Python
python打印文件的前几行或最后几行教程
Feb 13 Python
Django如何使用redis作为缓存
May 21 Python
python脚本和网页有何区别
Jul 02 Python
Python字典循环添加一键多值的用法实例
Jan 20 #Python
在PyCharm中批量查找及替换的方法
Jan 20 #Python
Python 移动光标位置的方法
Jan 20 #Python
Pycharm之快速定位到某行快捷键的方法
Jan 20 #Python
python实现画五角星和螺旋线的示例
Jan 20 #Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 #Python
解决pycharm的Python console不能调试当前程序的问题
Jan 20 #Python
You might like
如何删除多级目录
2006/10/09 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007/04/12 Javascript
wordpress之js库集合研究介绍
2007/08/17 Javascript
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
用js调用迅雷下载代码的二种方法
2013/04/15 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
Web前端开发工具——bower依赖包管理工具
2016/03/29 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
全面解析Angular中$Apply()及$Digest()的区别
2016/08/04 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
详解React中共享组件逻辑的三种方式
2021/02/02 Javascript
python的类方法和静态方法
2014/12/13 Python
浅谈Python单向链表的实现
2015/12/24 Python
浅谈pycharm使用及设置方法
2019/09/09 Python
Python和Sublime整合过程图示
2019/12/25 Python
Python中sys模块功能与用法实例详解
2020/02/26 Python
Python xlwt模块使用代码实例
2020/06/10 Python
利用CSS3的transition属性实现滑动效果
2015/08/05 HTML / CSS
个人简历自我评价八例
2013/10/31 职场文书
普通简短的个人自我评价
2014/02/15 职场文书
核心价值观演讲稿
2014/05/13 职场文书
2014最新党员批评与自我批评材料
2014/09/24 职场文书
入股协议书范本
2014/11/01 职场文书
大学生受助感言
2015/08/01 职场文书
公司会议开幕词
2016/03/03 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers