解决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 相关文章推荐
开始着手第一个Django项目
Jul 15 Python
Python使用os模块和fileinput模块来操作文件目录
Jan 19 Python
python正则表达式面试题解答
Apr 28 Python
详解Numpy中的广播原则/机制
Sep 20 Python
python内置数据类型之列表操作
Nov 12 Python
django echarts饼图数据动态加载的实例
Aug 12 Python
Python线程指南分享
Nov 19 Python
将自己的数据集制作成TFRecord格式教程
Feb 17 Python
Python利用FFT进行简单滤波的实现
Feb 26 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 Python
Anaconda的安装与虚拟环境建立
Nov 18 Python
Pyhton爬虫知识之正则表达式详解
Apr 01 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
DC的38部超级英雄动画电影
2020/03/03 欧美动漫
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
PHP实现页面静态化深入讲解
2021/03/04 PHP
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
JS获取各种浏览器窗口大小的方法
2014/01/14 Javascript
javascript类型转换示例
2014/04/29 Javascript
PHP PDO操作总结
2014/11/17 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
jQuery基于Ajax实现读取XML数据功能示例
2018/05/31 jQuery
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
20招让你的Python飞起来!
2016/09/27 Python
python3实现抓取网页资源的 N 种方法
2017/05/02 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
关于Python3 类方法、静态方法新解
2019/08/30 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
Nuts.com:优质散装,批发坚果、干果和巧克力等
2017/03/21 全球购物
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
人力资源专员岗位职责
2014/01/30 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
玩手机检讨书1000字
2014/10/20 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
幼儿教师师德师风自我评价
2015/03/05 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
解析Java异步之call future
2021/06/14 Java/Android