2013-01-10 72 views
0

在類Week中,我使用包含星期一至星期六的字符串鍵的.fromkey()方法創建了一本字典,並將它們全部初始化爲一個空列表:迭代列表字典時的奇怪輸出

self.weekDict = dict.fromkeys(dayNameList, []) 

我有那麼在員工列表進行迭代,並且,在每個迭代中,迭代工作日內,並追加一個員工每一天的相應weekDict列表功能:

def setWeekDict(employees): 
      for employee in employees: 
       for day in employees[employee].workDays: 
        self.weekDict[day].append(employee) 
        print "employee: " + employee 
        print "weekday/list: " + str(day) + str(self.weekDict[day]) 

我期待weekDict列表,以反映每個計劃工作的人給定的一天。相反,似乎每天的列表累積了我爲員工每天迭代的總次數。我的報表打印輸出這樣的:

employee: Addison 
weekday/list: Saturday['Addison'] 
employee: Addison 
weekday/list: Monday['Addison', 'Addison'] 
employee: Addison 
weekday/list: Tuesday['Addison', 'Addison', 'Addison'] 
employee: Addison 
weekday/list: Wednesday['Addison', 'Addison', 'Addison', 'Addison'] 
employee: Addison 
weekday/list: Thursday['Addison', 'Addison', 'Addison', 'Addison', 'Addison'] 

很顯然,我只是想「艾迪」或任何其他僱員出現每天一次,我不能在我的for循環將有助於各列表中添加員工明白什麼名稱+以前員工姓名已添加到其他列表的次數。我只能認爲dict.fromkeys()創建的鍵實際上都指向相同的列表,但我不認爲這是fromkeys()函數的工作方式。

+3

你沒仔細看我的答案:http://stackoverflow.com/a/14259052/846892 –

+0

哈哈,你必須自從我上次看到帖子後已經更新了它。謝謝。因此fromkeys()僅在使用可變對象時才複製引用 - 很好理解! – user1427661

+2

因此爲什麼它更快。 –

回答

2

fromkeys()如果與可變對象一起使用可能會導致此類行爲,因爲它將相同的對象(相同id())分配給字典的每個鍵。

In [16]: dic=dict.fromkeys("spam",[]) 

In [17]: [id(x) for x in dic.values()] #all of them are same objects 
Out[17]: [141885196, 141885196, 141885196, 141885196] 

In [18]: dic['s'].append(1) #changing one changes others as well 

In [19]: dic 
Out[19]: {'a': [1], 'm': [1], 'p': [1], 's': [1]} 

所以,dict-comprehensions必須用可變對象使用:

In [20]: dic={x:[] for x in "spam"} 

In [21]: [id(x) for x in dic.values()]    #unique objects 
Out[21]: [141884972, 141848300, 142262988, 141895980] 

In [22]: dic['s'].append(1) 

In [23]: dic 
Out[23]: {'a': [], 'm': [], 'p': [], 's': [1]} 
+0

如果您需要支持Python 2.6或之前的版本,請注意字典解析[2.7添加](http://www.python.org/dev/peps/pep-0274/)。您可以創建一個類似的生成器表達式並將其傳遞給'dict'構造器 - ''dic = dict((x,[])for dayNameList)''或者使用['defaultdict'](http://docs.python .org/2/library/collections.html#collections.defaultdict)(在2.5中添加) - 'from collections import defaultdic; dic = defaultdict(list)'。 – Blair