解决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之再深点,更懂list
Sep 20 Python
Python实现单词拼写检查
Apr 25 Python
Python的math模块中的常用数学函数整理
Feb 04 Python
Python中标准模块importlib详解
Apr 16 Python
python requests 使用快速入门
Aug 31 Python
简单实现python数独游戏
Mar 30 Python
Python常用字符串替换函数strip、replace及sub用法示例
May 21 Python
使用Python微信库itchat获得好友和群组已撤回的消息
Jun 24 Python
python获取中文字符串长度的方法
Nov 14 Python
Python2和3字符编码的区别知识点整理
Aug 08 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
django使用channels实现通信的示例
Oct 19 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
WINXP下apache+php4+mysql
2006/11/25 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
JQuery在光标位置插入内容的实现代码
2010/06/18 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
2013/01/23 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
js实现收缩菜单效果实例代码
2013/10/30 Javascript
JS OffsetParent属性深入解析
2014/01/13 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
js实现图片实时时钟
2020/01/15 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
c++生成dll使用python调用dll的方法
2014/01/20 Python
python类中super()和__init__()的区别
2016/10/18 Python
Python实现多线程抓取网页功能实例详解
2017/06/08 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
详解django三种文件下载方式
2018/04/06 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
对python 调用类属性的方法详解
2019/07/02 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
自动化专业个人求职信范文
2013/12/30 职场文书
优秀班集体获奖感言
2014/02/03 职场文书
购房协议书
2014/04/11 职场文书
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
公司仓库管理制度
2015/08/04 职场文书
敬老院活动感想
2015/08/07 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
2022/04/12 MySQL