成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

傳的是值還是引用? 構(gòu)造字典數(shù)組的一個(gè)bug

dockerclub / 2319人閱讀

摘要:在做數(shù)據(jù)處理的時(shí)候碰到一個(gè)奇怪的現(xiàn)象大興大興大興大興大興大興大興發(fā)現(xiàn)這個(gè)列表里的每個(gè)元素都是一樣的檢查循環(huán)里的和一切正常循環(huán)里的就不太正常朝陽海淀海淀昌平昌平昌平豐臺(tái)豐臺(tái)豐臺(tái)豐臺(tái)西城西城西城西城西城部分?jǐn)?shù)據(jù)是這樣的發(fā)生了的操作但列表里所有元

在做數(shù)據(jù)處理的時(shí)候, 碰到一個(gè)奇怪的現(xiàn)象.

for tuple in list.most_common():
    dict["name"] = tuple[0]
    dict["value"] = tuple[1]
    d1.append(dict)   
print(d1)
[{"name": "大興", "value": 32}, {"name": "大興", "value": 32}, {"name": "大興", "value": 32}, {"name": "大興", "value": 32}, {"name": "大興", "value": 32}, {"name": "大興", "value": 32}, {"name": "大興", "value": 32}]

發(fā)現(xiàn)d1這個(gè)列表里的每個(gè)元素都是一樣的. 檢查循環(huán)里的tuple 和 dict 一切正常.
循環(huán)里的d1 就不太正常...

for tuple in list.most_common():
    dict["name"] = tuple[0]
    dict["value"] = tuple[1]
    d1.append(dict)
    print(d1)
[{"name": "朝陽", "value": 102}]
[{"name": "海淀", "value": 65}, {"name": "海淀", "value": 65}]
[{"name": "昌平", "value": 53}, {"name": "昌平", "value": 53}, {"name": "昌平", "value": 53}]
[{"name": "豐臺(tái)", "value": 53}, {"name": "豐臺(tái)", "value": 53}, {"name": "豐臺(tái)", "value": 53}, {"name": "豐臺(tái)", "value": 53}]
[{"name": "西城", "value": 48}, {"name": "西城", "value": 48}, {"name": "西城", "value": 48}, {"name": "西城", "value": 48}, {"name": "西城", "value": 48}]

部分?jǐn)?shù)據(jù)是這樣的. 發(fā)生了append的操作, 但列表里所有元素的值都一樣. 為什么會(huì)這樣?


幾個(gè)小時(shí)后, 想到了一種可能性. 在append操作的時(shí)候, 傳入的是一個(gè)引用, 導(dǎo)致后期dict變化, 前面元素的值也跟著變化. 解決方法是傳入一個(gè)dict的copy, 傳一個(gè)值, 而不是引用.

修改后的代碼:

for tuple in list.most_common():
    dict["name"] = tuple[0]
    dict["value"] = tuple[1]
    d = copy.copy(dict)
    d1.append(d)
print(d1)
[{"name": "朝陽", "value": 102}, {"name": "海淀", "value": 65}, {"name": "豐臺(tái)", "value": 53}, {"name": "昌平", "value": 53}, {"name": "西城", "value": 48}, {"name": "通州", "value": 36}, {"name": "大興", "value": 32}, {"name": "東城", "value": 22}, {"name": "順義", "value": 18}, {"name": "石景山", "value": 16}, {"name": "NULL", "value": 11}, {"name": "房山", "value": 7}, {"name": "門頭溝", "value": 6}, {"name": "燕郊", "value": 5}, {"name": "亦莊開發(fā)區(qū)", "value": 3}]

ok, 確實(shí)是假想的那樣, 傳引用產(chǎn)生的問題, 加上一個(gè)拷貝語句就可以了. 可是之前也做過不少的利用append來構(gòu)造字典數(shù)組的案例, 從沒碰到過問題, 也沒有添加過拷貝. 仔細(xì)觀察之下, 發(fā)現(xiàn)我的 dict= {} 聲明是放在for循環(huán)外的. 那這應(yīng)該就是問題所在了.

再次修改后的代碼:

for tuple in list.most_common():
    # 把dict的定義放入 for 循環(huán)內(nèi)
    dict = {}
    dict["name"] = tuple[0]
    dict["value"] = tuple[1]
    # d = copy.copy(dict)
    d1.append(dict)
print(d1)

總結(jié)一下, 由于疏忽把dict= {}放在for循環(huán)外, 在append的時(shí)候, 一直添加的是同一個(gè)dict的引用, dict 內(nèi)的值變化, 引起了列表內(nèi)所有元素的變化.
在最后的修改里, 每一次循環(huán), 都會(huì)新建一個(gè)空字典, 每次循環(huán) dict 都是一個(gè)獨(dú)立的值. 正確的做法也應(yīng)該是這樣的.

PS: 嘗試了一下, Js的arr.push(obj) 也有同樣的問題, 當(dāng)然有良好編碼習(xí)慣的人是不會(huì)碰到這種問題的.

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41747.html

相關(guān)文章

  • Javascript - 函數(shù)里是值還是引用

    摘要:說明一下里函數(shù)傳的是值還是引用答案是都傳。如果傳入的參數(shù)是簡(jiǎn)單類型,如和,那么傳入的就是值。如果是對(duì)象和數(shù)組,在函數(shù)里做的操作就會(huì)影響到函數(shù)外邊。舉幾個(gè)栗子結(jié)語提問和糾錯(cuò)請(qǐng)留言。 說明一下 JavaScript里函數(shù)傳的是值還是引用?答案是都傳。如果傳入的參數(shù)是簡(jiǎn)單類型,如String和Number,那么傳入的就是值。但如果你傳入的是Object和Array,那么就是引用。 這就意...

    JerryZou 評(píng)論0 收藏0
  • 深入理解javascript按值傳遞與按引用傳遞

    摘要:引用類型參數(shù)的傳遞與引用類型的復(fù)制一樣,傳遞的是內(nèi)存地址。指向一個(gè)新的地址,與不再指向同一個(gè)地址官方解釋來一發(fā)中所有函數(shù)的參數(shù)都是按值傳遞的??偨Y(jié)很簡(jiǎn)單,函數(shù)參數(shù)都是按值傳遞都是棧內(nèi)數(shù)據(jù)的拷貝。 基本類型與引用類型 值類型(基本類型):String,Number,Boolean,Null,Undefined。 引用類型:Array、Object、Function、Date等有多個(gè)值...

    陳江龍 評(píng)論0 收藏0
  • 深入理解javascript按值傳遞與按引用傳遞

    摘要:引用類型參數(shù)的傳遞與引用類型的復(fù)制一樣,傳遞的是內(nèi)存地址。指向一個(gè)新的地址,與不再指向同一個(gè)地址官方解釋來一發(fā)中所有函數(shù)的參數(shù)都是按值傳遞的。總結(jié)很簡(jiǎn)單,函數(shù)參數(shù)都是按值傳遞都是棧內(nèi)數(shù)據(jù)的拷貝。 基本類型與引用類型 值類型(基本類型):String,Number,Boolean,Null,Undefined。 引用類型:Array、Object、Function、Date等有多個(gè)值...

    hedzr 評(píng)論0 收藏0
  • js基礎(chǔ)深入淺出

    摘要:當(dāng)多個(gè)事件觸發(fā)的時(shí)候,會(huì)把異步事件依次的放入里等同步事件執(zhí)行完之后,再去隊(duì)列里一個(gè)個(gè)執(zhí)行拾遺常用方法總結(jié)面試的信心來源于過硬的基礎(chǔ)參考高級(jí)程序設(shè)計(jì)你所不知道的深入淺出知識(shí)點(diǎn)思維導(dǎo)圖經(jīng)典實(shí)例總結(jié)那些剪不斷理還亂的關(guān)系 持續(xù)不斷更新。。。 基本類型和引用類型 vue props | Primitive vs Reference Types 基本類型和字面值之間的區(qū)別 基本類型和字面值相等,...

    phodal 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<