解决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 相关文章推荐
Python3 能振兴 Python的原因分析
Nov 28 Python
Python简单进程锁代码实例
Apr 27 Python
Python入门教程之if语句的用法
May 14 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
Dec 19 Python
python 环境搭建 及python-3.4.4的下载和安装过程
Jul 20 Python
python经典趣味24点游戏程序设计
Jul 26 Python
详解如何减少python内存的消耗
Aug 09 Python
Python Tkinter模块 GUI 可视化实例
Nov 20 Python
Python无头爬虫下载文件的实现
Apr 02 Python
python打包生成so文件的实现
Oct 30 Python
Python list和str互转的实现示例
Nov 16 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 autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
php生成扇形比例图实例
2013/11/06 PHP
php url路由入门实例
2014/04/23 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
精心挑选的15款优秀jQuery 本特效插件和教程
2012/08/06 Javascript
JS中的prototype与面向对象的实例讲解
2013/05/22 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
javascript笔记之匿名函数和闭包
2017/02/06 Javascript
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
js中位运算的运用实例分析
2018/12/11 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
微信小程序如何实现全局重新加载
2019/06/05 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
pandas数据分组和聚合操作方法
2018/04/11 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
Django项目使用CircleCI的方法示例
2019/07/14 Python
wxpython布局的实现方法
2019/11/01 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
在python中做正态性检验示例
2019/12/09 Python
keras实现多种分类网络的方式
2020/06/11 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
台湾专柜女包:KINAZ
2019/12/26 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
机械工程师的岗位职责
2013/11/17 职场文书
工业自动化专业毕业生推荐信
2013/11/18 职场文书
在pyCharm中下载第三方库的方法
2021/04/18 Python
Python如何把不同类型数据的json序列化
2021/04/30 Python