解决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聚类算法之DBSACN实例分析
Nov 20 Python
Python闭包的两个注意事项(推荐)
Mar 20 Python
python list元素为tuple时的排序方法
Apr 18 Python
python pandas 如何替换某列的一个值
Jun 09 Python
Python数据持久化shelve模块用法分析
Jun 29 Python
python实现括号匹配的思路详解
Aug 23 Python
Python 中导入csv数据的三种方法
Nov 01 Python
Python基础之循环语句用法示例【for、while循环】
Mar 23 Python
pyqt5实现登录界面的模板
May 30 Python
python字符串切割:str.split()与re.split()的对比分析
Jul 16 Python
Django 1.10以上版本 url 配置注意事项详解
Aug 05 Python
Python爬虫网络请求之代理服务器和动态Cookies
Apr 12 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
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
php计算title标题相似比的方法
2015/07/29 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
PHP实现转盘抽奖算法分享
2020/04/15 PHP
jQuery动画效果-slideUp slideDown上下滑动示例代码
2013/08/28 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
JS中with的替代方法与String中的正则方法详解
2016/12/23 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
layui树形菜单动态遍历的例子
2019/09/23 Javascript
vue vant中picker组件的使用
2020/11/03 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
Python二分法搜索算法实例分析
2015/05/11 Python
python递归查询菜单并转换成json实例
2017/03/27 Python
Python实现网站注册验证码生成类
2017/06/08 Python
python利用正则表达式排除集合中字符的功能示例
2017/10/10 Python
在python中bool函数的取值方法
2018/11/01 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
介绍一下write命令
2014/08/10 面试题
中间件分为哪几类
2016/09/18 面试题
继承权公证书
2014/04/09 职场文书
旅游节目策划方案
2014/05/26 职场文书
安全演讲稿开场白
2014/08/25 职场文书
2015年科室工作总结
2015/04/10 职场文书