解决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 相关文章推荐
浅谈numpy库的常用基本操作方法
Jan 09 Python
Windows下python3.6.4安装教程
Jul 31 Python
python随机数分布random测试
Aug 27 Python
浅谈Python中的bs4基础
Oct 21 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
python中enumerate() 与zip()函数的使用比较实例分析
Sep 03 Python
Django Admin中增加导出Excel功能过程解析
Sep 04 Python
PyCharm无法引用自身项目解决方式
Feb 12 Python
django迁移文件migrations的实现
Mar 31 Python
python中shell执行知识点
May 06 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
Feb 04 Python
python+pyhyper实现识别图片中的车牌号思路详解
Dec 24 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
PHP中static关键字以及与self关键字的区别
2015/07/01 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
2015/03/13 Javascript
js完美解决IE6不支持position:fixed的bug
2015/04/24 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
JS开发中基本数据类型具体有哪几种
2017/10/19 Javascript
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
2019/09/03 jQuery
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
可用于监控 mysql Master Slave 状态的python代码
2013/02/10 Python
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
python基础教程之缩进介绍
2014/08/29 Python
跟老齐学Python之一个免费的实验室
2014/09/14 Python
Python科学计算之NumPy入门教程
2017/01/15 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
python-numpy-指数分布实例详解
2019/12/07 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
2020/04/07 Python
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
html5 利用canvas实现超级玛丽简单动画
2013/09/06 HTML / CSS
致全体运动员广播稿
2014/02/01 职场文书
广告词串烧
2014/03/19 职场文书
建筑工程造价专业自荐信
2014/07/08 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书