解决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 相关文章推荐
一个计算身份证号码校验位的Python小程序
Aug 15 Python
python获取文件后缀名及批量更新目录下文件后缀名的方法
Nov 11 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
May 16 Python
Python中字典的基础知识归纳小结
Aug 19 Python
Python HTTP客户端自定义Cookie实现实例
Apr 28 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
Nov 03 Python
python 中if else 语句的作用及示例代码
Mar 05 Python
python3之模块psutil系统性能信息使用
May 30 Python
Python中的groupby分组功能的实例代码
Jul 11 Python
python_opencv用线段画封闭矩形的实例
Dec 05 Python
Python3.5面向对象编程图文与实例详解
Apr 24 Python
Python日志模块logging用法
Jun 05 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编程获取音频文件时长的方法【基于getid3类】
2017/04/20 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
js跑马灯代码(自写)
2013/04/17 Javascript
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
2013/11/25 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
2015/03/03 Javascript
JavaScript将字符串转换为整数的方法
2015/04/14 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
2016/09/27 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
javaScript基础详解
2017/01/19 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
2017/06/08 Javascript
jQuery EasyUI Layout实现tabs标签的实例
2017/09/26 jQuery
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
Echarts实现多条折线可拖拽效果
2019/12/19 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
跨平台python异步回调机制实现和使用方法
2013/11/26 Python
python网络编程之文件下载实例分析
2015/05/20 Python
python实现计算倒数的方法
2015/07/11 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
Python 查看文件的编码格式方法
2017/12/21 Python
python2.7实现FTP文件下载功能
2018/04/15 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
python中 _、__、__xx__()区别及使用场景
2020/06/30 Python
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
精细化工应届生求职信
2013/11/17 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
2014年社区工作总结
2014/11/18 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
社区节水倡议书
2015/04/29 职场文书
MySQL 那些常见的错误设计规范,你都知道吗
2021/07/16 MySQL
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python