解决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编写一个基于终端的实现翻译的脚本
Apr 24 Python
Python中的深拷贝和浅拷贝详解
Jun 03 Python
分享一下Python 开发者节省时间的10个方法
Oct 02 Python
NumPy 数学函数及代数运算的实现代码
Jul 18 Python
python的内存管理和垃圾回收机制详解
May 18 Python
python字符串和常用数据结构知识总结
May 21 Python
详解numpy的argmax的具体使用
May 27 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
Jun 14 Python
Django实现基于类的分页功能
Oct 31 Python
python实现输出一个序列的所有子序列示例
Nov 18 Python
Python Dataframe常见索引方式详解
May 27 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
Jun 09 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安全配置
2006/12/06 PHP
Laravel框架表单验证详解
2014/09/04 PHP
46 个非常有用的 PHP 代码片段
2016/02/16 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
2018/01/29 PHP
Laravel模糊查询区分大小写的实例
2019/09/29 PHP
在js中使用"with"语句中跨frame的变量引用问题
2007/03/08 Javascript
js图片自动切换效果处理代码
2013/05/07 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
jquery实现当滑动到一定位置时固定效果
2014/06/17 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
浅谈JavaScript中运算符的优先级
2015/07/07 Javascript
js实现网页抽奖实例
2015/08/05 Javascript
javascript实现添加附件功能的方法
2015/11/18 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
Python3读取zip文件信息的方法
2015/05/22 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
Python实现代码统计工具(终极篇)
2016/07/04 Python
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
Python切片工具pillow用法示例
2018/03/30 Python
python3实现随机数
2018/06/25 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
HTML5 CSS3新的WEB标准和浏览器支持
2009/07/16 HTML / CSS
澳大利亚运动鞋商店:Platypus Shoes
2019/09/27 全球购物
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
应届实习生的自我评价范文
2014/01/05 职场文书
学生自我评价范文
2014/02/02 职场文书
铲车司机岗位职责
2014/03/15 职场文书
基层党员对照检查材料
2014/08/25 职场文书
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android