摘要:在做數據處理的時候碰到一個奇怪的現象大興大興大興大興大興大興大興發現這個列表里的每個元素都是一樣的檢查循環里的和一切正常循環里的就不太正常朝陽海淀海淀昌平昌平昌平豐臺豐臺豐臺豐臺西城西城西城西城西城部分數據是這樣的發生了的操作但列表里所有元
在做數據處理的時候, 碰到一個奇怪的現象.
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}]
發現d1這個列表里的每個元素都是一樣的. 檢查循環里的tuple 和 dict 一切正常.
循環里的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": "豐臺", "value": 53}, {"name": "豐臺", "value": 53}, {"name": "豐臺", "value": 53}, {"name": "豐臺", "value": 53}]
[{"name": "西城", "value": 48}, {"name": "西城", "value": 48}, {"name": "西城", "value": 48}, {"name": "西城", "value": 48}, {"name": "西城", "value": 48}]
部分數據是這樣的. 發生了append的操作, 但列表里所有元素的值都一樣. 為什么會這樣?
幾個小時后, 想到了一種可能性. 在append操作的時候, 傳入的是一個引用, 導致后期dict變化, 前面元素的值也跟著變化. 解決方法是傳入一個dict的copy, 傳一個值, 而不是引用.
修改后的代碼:
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": "豐臺", "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": "亦莊開發區", "value": 3}]
ok, 確實是假想的那樣, 傳引用產生的問題, 加上一個拷貝語句就可以了. 可是之前也做過不少的利用append來構造字典數組的案例, 從沒碰到過問題, 也沒有添加過拷貝. 仔細觀察之下, 發現我的 dict= {} 聲明是放在for循環外的. 那這應該就是問題所在了.
再次修改后的代碼:
for tuple in list.most_common(): # 把dict的定義放入 for 循環內 dict = {} dict["name"] = tuple[0] dict["value"] = tuple[1] # d = copy.copy(dict) d1.append(dict) print(d1)
總結一下, 由于疏忽把dict= {}放在for循環外, 在append的時候, 一直添加的是同一個dict的引用, dict 內的值變化, 引起了列表內所有元素的變化.
在最后的修改里, 每一次循環, 都會新建一個空字典, 每次循環 dict 都是一個獨立的值. 正確的做法也應該是這樣的.
PS: 嘗試了一下, Js的arr.push(obj) 也有同樣的問題, 當然有良好編碼習慣的人是不會碰到這種問題的.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41747.html
摘要:說明一下里函數傳的是值還是引用答案是都傳。如果傳入的參數是簡單類型,如和,那么傳入的就是值。如果是對象和數組,在函數里做的操作就會影響到函數外邊。舉幾個栗子結語提問和糾錯請留言。 說明一下 JavaScript里函數傳的是值還是引用?答案是都傳。如果傳入的參數是簡單類型,如String和Number,那么傳入的就是值。但如果你傳入的是Object和Array,那么就是引用。 這就意...
摘要:引用類型參數的傳遞與引用類型的復制一樣,傳遞的是內存地址。指向一個新的地址,與不再指向同一個地址官方解釋來一發中所有函數的參數都是按值傳遞的??偨Y很簡單,函數參數都是按值傳遞都是棧內數據的拷貝。 基本類型與引用類型 值類型(基本類型):String,Number,Boolean,Null,Undefined。 引用類型:Array、Object、Function、Date等有多個值...
摘要:引用類型參數的傳遞與引用類型的復制一樣,傳遞的是內存地址。指向一個新的地址,與不再指向同一個地址官方解釋來一發中所有函數的參數都是按值傳遞的??偨Y很簡單,函數參數都是按值傳遞都是棧內數據的拷貝。 基本類型與引用類型 值類型(基本類型):String,Number,Boolean,Null,Undefined。 引用類型:Array、Object、Function、Date等有多個值...
閱讀 1168·2021-11-15 18:14
閱讀 3635·2021-11-15 11:37
閱讀 759·2021-09-24 09:47
閱讀 2442·2021-09-04 16:48
閱讀 2185·2019-08-30 15:53
閱讀 2386·2019-08-30 15:53
閱讀 395·2019-08-30 11:20
閱讀 1238·2019-08-29 16:08