Python 2.7 在while循环内(相对于外部)声明对象

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

给出下面的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被正确加载

为什么????为什么返回的最后一行会在整个列表中传播

谢谢

这是由于list.append插入了对faultReportObj的引用,而没有复制dict的值

另一种看待它的方式:

如果在循环之前定义faultReportObj,则会发生以下情况:

创建一个新的dict。 填充它。 将对dict的引用附加到列表中。 更改dict的内容。 将另一个引用附加到同一个dict。 等 下面是一段简短的代码,举例说明此属性:

>>> d = {}
>>> l = []
>>> l.append(d)
>>> d[1] = 2
>>> l
[{1: 2}]

您希望在第一步中,在循环的每次迭代中创建一个新的dict,以便每次都附加一个不同的dict。

Wow。不易察觉的谢谢今天早上我回到了我的代码库,看起来这是我第一次尝试以这种方式在循环外声明dict。不知道我怎么会错过它!