1. 程式人生 > >Python字典的fromkeys方法“疑惑”解析

Python字典的fromkeys方法“疑惑”解析

       今天寫python程式用到了字典中的fromkeys方法初始化字典的值為空列表,然後使用append方法,結果讓我大為詫異,最後使用傳統的方法初始化即{Key1:[],Key2:[]},然後再使用append得到正確結果,最後發現最本質的原因是初始化使用的值地址是相同的,這樣你給一個鍵賦值時,其他鍵的值也會得到這個結果,具體詳解見本文後面的一個連結。如此本想寫一篇部落格記錄之,在網上看到有總結比較好的文章,故轉載一下。

主要內容 我在查怎麼建立多個字典鍵時,發現了fromkeys方法,真實用法是這樣的

d = {} d = d.fromkeys(seq, val) 1 2 而不是網上流傳的錯誤的用法d.fromkeys(seq[, val]),所以新手看到這個方法一定要注意一下。

其中seq為包含所要建立的鍵的列表,val是一個值,下面是例項

seq = ['o1', 'o2', 'o3'] d = {} d = d.fromkeys(seq) print('缺val的結果:', str(d)) dd = {} dd = dd.fromkeys(seq, 10) print('正常結果:', str(dd))

#下面為輸出結果 缺val的結果:{'o1':None, 'o2':None, 'o3':None} 正常結果:{'o1':10, 'o2':10, 'o3':10} 需要注意的是,這裡的val只能是一個數或者一個字串之類的,重點是一個,一個列表、字典也行。如果是列表,那麼每個鍵的值就會是這個列表了,比如

val = [1, 2, 3] dd = dd.fromekys(seq, dd) print(str(dd))

#下面為輸出結果 {'o1':[1, 2, 3], 'o2':[1, 2, 3], 'o3':[1, 2, 3]}

所以回到我們最開始遺傳演算法的思路,如果利用這樣去建立多個物件怎麼樣?這樣也是可以的。

但是 如果我們對列表增加了一個元素,比如說append一下,那麼所有的列表都會append。如果直接修改值,那麼不會有這樣的變化。

d['o1'].append(1) print(str(d)) d['o1'] = 1 print(str(d))

#以下為輸出結果 {'o1':[1, 2, 3, 1], 'o2':[1, 2, 3, 1], 'o3':[1, 2, 3, 1]} {'o1':1, 'o2':[1, 2, 3, 1], 'o3':[1, 2, 3, 1]} 看,我改變了o1鍵的值,結果o2和o3的值也都改變了。所以這是一個坑,得小心使用這個函式。

小結

回到我們最初探討的原因(前幾篇文章),所以這個fromkeys方法並不適用來建立多個物件,因為我如果改變了某一個物件中的某個屬性,那麼其餘物件都會被改變。

但如果本來就想要呈現這種(連坐的)效果,那麼這個方法真是太好不過了。

如果喜歡的話,麻煩點個喜歡哦~