给出下面的python 2.7代码:
# faultReportObj = {}
flatDataObj = []
while row:
faultReportObj = {}
faultReportObj['MessageTime'] = row['MessageTime']
faultReportObj['Event'] = row['Event']
faultReportObj['Subsystem'] = row['Subsystem']
faultReportObj['UnifiedFaultCode'] = row['UnifiedFaultCode']
faultReportObj['FaultDescription'] = row['FaultDescription']
faultReportObj['FaultDetails'] = row['FaultDetails']
faultReportObj['FirstOccurrenceDateTime'] = row['FirstOccurrenceDateTime']
faultReportObj['LastOccurrenceDateTime'] = row['LastOccurrenceDateTime']
faultReportObj['OccurrenceCount'] = row['OccurrenceCount']
print "current row:"
pp.pprint(faultReportObj)
flatDataObj.append(faultReportObj)
row = cursor.fetchone()
conn.close()
pp.pprint(flatDataObj)
如果我在while循环中声明faultReportObj
,我会在flatDataObj
中得到(比方说)96个条目,这些条目都与查询返回的最后一行完全相同。请注意,while循环中的pprint
语句打印预期的(变化的)结果。
如上所述,我在循环中声明faultReportObj
,正确加载flatDataObj。
为什么????为什么返回的最后一行在整个列表中传播?
谢谢!
答案 0 :(得分:1)
这是因为list.append
将引用插入faultReportObj
而不是复制dict
的值。
另一种看待它的方式:
如果在循环之前定义faultReportObj
,则会发生以下情况:
这是一段简短的代码,展示了这个属性:
>>> d = {}
>>> l = []
>>> l.append(d)
>>> d[1] = 2
>>> l
[{1: 2}]
你想要的是第一步(创建一个新的dict)在循环的每次迭代中发生,这样你每次都会附加一个不同的dict。