Python 2.7 在while循环内(相对于外部)声明对象
给出下面的python 2.7代码:Python 2.7 在while循环内(相对于外部)声明对象,python-2.7,Python 2.7,给出下面的python 2.7代码: # faultReportObj = {} flatDataObj = [] while row: faultReportObj = {} faultReportObj['MessageTime'] = row['MessageTime'] faultReportObj['Event'] = row['Event'] faultReportObj['Subsys
# 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被正确加载
为什么????为什么返回的最后一行会在整个列表中传播
谢谢 这是由于list.append插入了对faultReportObj的引用,而没有复制dict的值
另一种看待它的方式:
如果在循环之前定义faultReportObj,则会发生以下情况:
创建一个新的dict。
填充它。
将对dict的引用附加到列表中。
更改dict的内容。
将另一个引用附加到同一个dict。
等
下面是一段简短的代码,举例说明此属性:
>>> d = {}
>>> l = []
>>> l.append(d)
>>> d[1] = 2
>>> l
[{1: 2}]
您希望在第一步中,在循环的每次迭代中创建一个新的dict,以便每次都附加一个不同的dict。Wow。不易察觉的谢谢今天早上我回到了我的代码库,看起来这是我第一次尝试以这种方式在循环外声明dict。不知道我怎么会错过它!