解决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实现360的字符显示界面
Feb 21 Python
Python中利用函数装饰器实现备忘功能
Mar 30 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
Oct 11 Python
浅谈function(函数)中的动态参数
Apr 30 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
Jul 17 Python
浅谈python连续赋值可能引发的错误
Nov 10 Python
浅谈Pycharm调用同级目录下的py脚本bug
Dec 03 Python
python sqlite的Row对象操作示例
Sep 11 Python
python中with语句结合上下文管理器操作详解
Dec 19 Python
git查看、创建、删除、本地、远程分支方法详解
Feb 18 Python
Python实现壁纸下载与轮换
Oct 19 Python
解析目标检测之IoU
Jun 26 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
eAccelerator的安装与使用详解
2013/06/13 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
老生常谈js中0到底是 true 还是 false
2017/03/08 Javascript
jQuery实现页面倒计时并刷新效果
2017/03/13 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
vue实现简单图片上传
2020/06/30 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
Python 加密的实例详解
2017/10/09 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
2020/04/16 Python
如何搭建pytorch环境的方法步骤
2020/05/06 Python
简单的命令查看安装的python版本号
2020/08/28 Python
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
学校班班通实施方案
2014/06/11 职场文书
施工安全协议书范本
2014/09/26 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
校园新闻稿范文
2015/07/18 职场文书
学校教代会开幕词
2016/03/04 职场文书
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python