解决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 GAE、Django导出Excel的方法
Nov 24 Python
python新手经常遇到的17个错误分析
Jul 30 Python
python在不同层级目录import模块的方法
Jan 31 Python
Python的shutil模块中文件的复制操作函数详解
Jul 05 Python
Python二叉树定义与遍历方法实例分析
May 25 Python
Python实现的KMeans聚类算法实例分析
Dec 29 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 Python
Python使用monkey.patch_all()解决协程阻塞问题
Apr 15 Python
Python小白垃圾回收机制入门
Jun 09 Python
Pycharm安装Qt Design快捷工具的详细教程
Nov 18 Python
使用Python提取文本中含有特定字符串的方法示例
Dec 09 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使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
jquery实现checkbox 全选/全不选的通用写法
2014/02/22 Javascript
javascript连续赋值问题
2015/07/08 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
JavaScript模拟实现自由落体效果
2018/08/28 Javascript
Vue2.x Todo之自定义指令实现自动聚焦的方法
2019/01/08 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
跟老齐学Python之使用Python操作数据库(1)
2014/11/25 Python
python入门基础之用户输入与模块初认识
2016/11/14 Python
Python列表list常用内建函数实例小结
2019/10/22 Python
Python devel安装失败问题解决方案
2020/06/09 Python
Pycharm调试程序技巧小结
2020/08/08 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
python爬虫beautifulsoup解析html方法
2020/12/07 Python
Python中过滤字符串列表的方法
2020/12/22 Python
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
delegate与普通函数的区别
2014/01/22 面试题
.NET初级开发工程师面试题(包括Javascript)
2012/08/22 面试题
工厂会计员职责
2014/02/06 职场文书
国际贸易专业个人职业生涯规划
2014/02/15 职场文书
赔偿协议书范本
2014/04/15 职场文书
信电学院毕业生自荐书
2014/05/24 职场文书
承诺书格式范文
2014/06/03 职场文书
2014最新版群众路线四风整改措施
2014/09/24 职场文书
商铺门面租房协议书
2014/10/21 职场文书
2014七年级班主任工作总结
2014/12/05 职场文书
《詹天佑》教学反思
2016/02/20 职场文书