解决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求素数示例分享
Feb 16 Python
python通过邮件服务器端口发送邮件的方法
Apr 30 Python
Python字符串拼接、截取及替换方法总结分析
Apr 13 Python
Python编程实现删除VC临时文件及Debug目录的方法
Mar 22 Python
初学python的操作难点总结(新手必看篇)
Aug 03 Python
Python Socket使用实例
Dec 18 Python
python抽取指定url页面的title方法
May 11 Python
python实现最长公共子序列
May 22 Python
Python字符串对象实现原理详解
Jul 01 Python
Python操作注册表详细步骤介绍
Feb 05 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 Python
python中的装饰器该如何使用
Jun 18 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设置图片文件上传大小的具体实现方法
2013/10/11 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
php实现递归与无限分类的方法
2015/02/16 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
2011/07/31 Javascript
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
2019/11/25 Javascript
three.js利用卷积法如何实现物体描边效果
2019/11/27 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
Python中多线程及程序锁浅析
2015/01/21 Python
python中requests和https使用简单示例
2018/01/18 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
解决python 输出是省略号的问题
2018/04/19 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
座谈会主持词
2014/03/20 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
高中生第一学年自我鉴定2015
2014/09/28 职场文书
警示教育观后感
2015/06/17 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书
MySQL事务操作的四大特性以及并发事务问题
2022/04/12 MySQL