解决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 30 Python
Python格式化css文件的方法
Mar 10 Python
详细介绍Python的鸭子类型
Sep 12 Python
详解python 发送邮件实例代码
Dec 22 Python
python使用RNN实现文本分类
May 24 Python
python2 与 python3 实现共存的方法
Jul 12 Python
python向字符串中添加元素的实例方法
Jun 28 Python
处理python中多线程与多进程中的数据共享问题
Jul 28 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
Feb 17 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 Python
Python并发编程实例教程之线程的玩法
Jun 20 Python
Python基本数据类型之字符串str
Jul 21 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 a simple smtp class
2007/11/26 PHP
php中将数组存到文件里的实现代码
2012/01/19 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
微信支付如何实现内置浏览器的H5页面支付
2015/09/25 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
2015/11/02 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
2015/11/17 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
JavaScript实现简单的日历效果
2016/09/25 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
js装饰设计模式学习心得
2018/02/17 Javascript
微信小程序公用参数与公用方法用法示例
2019/01/09 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
python实现按任意键继续执行程序
2016/12/30 Python
python中判断文件编码的chardet(实例讲解)
2017/12/21 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
python打开文件的方式有哪些
2020/06/29 Python
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
2013年入党人员的自我鉴定
2013/10/25 职场文书
两只小狮子教学反思
2014/02/05 职场文书
购房协议书范本(无房产证)
2014/10/07 职场文书
党员个人批评与自我批评
2014/10/14 职场文书
未婚证明格式
2015/06/15 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers