在while循环中声明一个对象(与外部相对)

时间:2018-01-10 21:11:57

标签: python-2.7

给出下面的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。

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

谢谢!

1 个答案:

答案 0 :(得分:1)

这是因为list.append引用插入faultReportObj而不是复制dict的值。

另一种看待它的方式:

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

  1. 制作新词典。
  2. 填充它。
  3. 将对dict的引用添加到列表中。
  4. 更改字典的内容。
  5. 添加对同一个词典的另一个引用。
  6. 这是一段简短的代码,展示了这个属性:

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

    你想要的是第一步(创建一个新的dict)在循环的每次迭代中发生,这样你每次都会附加一个不同的dict。