2016-01-29 80 views
4

我已經清空列表與年初宣佈的所有鍵的字典:追加到詞典列表的增加價值,每一個關鍵

>>> keys = ["k1", "k2", "k3"] 
>>> d = dict.fromkeys(keys, []) 
>>> d 
{'k2': [], 'k3': [], 'k1': []} 

當我嘗試座標對(名單["x1", "y1"])添加到一個關鍵的名單,而不是它添加到所有鍵名單:

>>> d["k1"].append(["x1", "y1"]) 
>>> d 
{'k1': [['x1', 'y1']], 'k2': [['x1', 'y1']], 'k3': [['x1', 'y1']]} 

我一直在尋找的是:

>>> d 
{'k1': [['x1', 'y1']], 'k3': [], 'k1': []} 

我如何在Python 3中實現這一點?

回答

3

看起來像這些列表中的每一個實際上是對單個列表的引用。追加到其中之一附加到所有這些。

我不認爲你可以解決這個問題,同時仍然使用fromkeys。請嘗試使用字典理解。

d = {k: [] for k in keys} 
2

創建你的字典裏是這樣的:

d = {k: [] for k in keys} 

dict.fromkeys()把一個參照相同的列表作爲值的所有鍵到字典。

您可以通過看你的價值觀的id想象這樣的:

>>> d = dict.fromkeys(keys,[]) 
>>> [id(v) for v in d.values()] 
[4413495432, 4413495432, 4413495432] 

因爲id唯一標識對象,這意味着你有相同的對象三次。

3

fromkeys是一個類方法,它傳遞第二個參數作爲所有鍵的值,因此它們都會引用一個對象。相反,如果你不傳遞值python會考慮None作爲每個項目的值。然後,而不是追加你可以指定一個二維列表,你的關鍵:

>>> d = dict.fromkeys(keys) 
>>> d["k1"] = [["x1", "y1"]] 
>>> d 
{'k3': None, 'k2': None, 'k1': [['x1', 'y1']]} 

這是怎麼蟒蛇創造了fromkeys方法:

@classmethod 
def fromkeys(cls, iterable, value=None): 
    d = cls() 
    for key in iterable: 
     d[key] = value 
    return d