解決python字典對(duì)值(值為列表)賦值出現(xiàn)重復(fù)的問題
可能很少有人遇到這個(gè)問題,網(wǎng)上也沒找到,這里記錄一下,希望也可以幫到其他人。
問題描述:假設(shè)有一個(gè)字典data,其鍵不定,可能隨時(shí)添加鍵(這不是關(guān)鍵),某一個(gè)鍵下面對(duì)應(yīng)的值為一個(gè)長(zhǎng)度為10的list,初始化為0,然后我想修改某些鍵下面的列表中的某一個(gè)值,比如data有一個(gè)鍵'k',對(duì)應(yīng)的值為[0,0,0,0,0,0,0,0,0,0],現(xiàn)在我想把鍵'k'對(duì)應(yīng)的列表的第三個(gè)數(shù)改成3,即[0,0,3,0,0,0,0,0,0,0],可是意外的事情發(fā)生了,如果data還有一個(gè)鍵'k1',假設(shè)其值為[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代碼不難看懂,我感覺理論上應(yīng)該輸出:{'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]},感覺莫名其妙,于是準(zhǔn)備調(diào)試,先import pdb,再在需要打斷點(diǎn)的前一句加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的鍵對(duì)應(yīng)的列表某一個(gè)值那一句:

查看data和index值:

正常。往下執(zhí)行一步,即執(zhí)行賦值操作,再查看data值:

在這里真想來一句mdblgl,明明index是'new',明明是對(duì)data['new'][1]賦值,關(guān)data['repeat'][1]屁事,它跟著變什么?可想而知,后面對(duì)data['repeat'][1]再賦一個(gè)值11,那'new'的值不就也跟著一起變,結(jié)果就是得到了最后那個(gè)莫名其妙的結(jié)果。
試過很多辦法,想過很多原因,無(wú)賴才疏學(xué)淺,不知道是什么原理,最后,只好用一種非常笨的方法解決了:
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在此,希望知道為什么這樣的大佬指點(diǎn)一下,萬(wàn)分感謝!
以上這篇解決python字典對(duì)值(值為列表)賦值出現(xiàn)重復(fù)的問題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python面向?qū)ο蟪绦蛟O(shè)計(jì)OOP深入分析【構(gòu)造函數(shù),組合類,工具類等】
這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O(shè)計(jì)OOP,較為詳細(xì)的深入分析了Python面向?qū)ο蟮臉?gòu)造函數(shù),組合類,工具類等相關(guān)概念、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2019-01-01
python 中的divmod數(shù)字處理函數(shù)淺析
這篇文章主要介紹了python divmod數(shù)字處理函數(shù)的相關(guān)資料,感興趣的朋友一起看看吧2017-10-10
python讀取excel指定列數(shù)據(jù)并寫入到新的excel方法
今天小編就為大家分享一篇python讀取excel指定列數(shù)據(jù)并寫入到新的excel方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Python 使用 attrs 和 cattrs 實(shí)現(xiàn)面向?qū)ο缶幊痰膶?shí)踐
這篇文章主要介紹了Python 使用 attrs 和 cattrs 實(shí)現(xiàn)面向?qū)ο缶幊痰膶?shí)踐,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06

