在类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']
显然我只希望'Addison'或任何其他员工每天出现一次,我无法理解我的for循环中的内容会对每个列表添加员工姓名+员工姓名的次数有所贡献之前被添加到其他列表中。我只能认为dict.fromkeys()创建的键实际上都指向同一个列表,但我不认为这是fromkeys()函数的工作方式。
答案 0 :(得分: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]}