将对象追加到循环中列出 - 而不是我所期望的

时间:2013-12-12 14:05:03

标签: python iteration

我将一个对象附加到这样的列表中:

    json_object = []
    nodes = soup.findAll(params["node_name"])
    for node in nodes:
        obj = tags
        for element in node:
            if element.name != None:
              obj[element.name] = str(element.text)
        print obj
        json_object.append(obj)
        print json_object

这是前两次迭代的输出:

{'sl_no': '1', 'sl_runs': '98', 'sl_name': 'Khumalo S', 'sl_wins': '12', 'sl_level': '-19.30', 'country': 'SA', 'date_from': '01 November 2013', 'sl_third': '12', 'sl_place': '8', 'sl_second': '16', 'stat_desc': u'Top Jockeys in South Africa ONLY 01 November 2013 to 20 November 2013', 'sl_wins_pc': '12.24', 'sl_winplace': '51.02', 'date_to': '20 November 2013', 'sl_fourth': '10', 'stat_type': u'Jockeys', 'region': 'South Africa ONLY', 'sl_stake_earned': 'R1 018 300'}
[{'sl_no': '1', 'sl_runs': '98', 'sl_name': 'Khumalo S', 'sl_wins': '12', 'sl_level': '-19.30', 'country': 'SA', 'date_from': '01 November 2013', 'sl_third': '12', 'sl_place': '8', 'sl_second': '16', 'stat_desc': u'Top Jockeys in South Africa ONLY 01 November 2013 to 20 November 2013', 'sl_wins_pc': '12.24', 'sl_winplace': '51.02', 'date_to': '20 November 2013', 'sl_fourth': '10', 'stat_type': u'Jockeys', 'region': 'South Africa ONLY', 'sl_stake_earned': 'R1 018 300'}]
{'sl_no': '2', 'sl_runs': '41', 'sl_name': 'Marcus A', 'sl_wins': '12', 'sl_level': '-8.70', 'country': 'SA', 'date_from': '01 November 2013', 'sl_third': '3', 'sl_place': '2', 'sl_second': '3', 'stat_desc': u'Top Jockeys in South Africa ONLY 01 November 2013 to 20 November 2013', 'sl_wins_pc': '29.27', 'sl_winplace': '48.78', 'date_to': '20 November 2013', 'sl_fourth': '2', 'stat_type': u'Jockeys', 'region': 'South Africa ONLY', 'sl_stake_earned': 'R690 750'}
[{'sl_no': '2', 'sl_runs': '41', 'sl_name': 'Marcus A', 'sl_wins': '12', 'sl_level': '-8.70', 'country': 'SA', 'date_from': '01 November 2013', 'sl_third': '3', 'sl_place': '2', 'sl_second': '3', 'stat_desc': u'Top Jockeys in South Africa ONLY 01 November 2013 to 20 November 2013', 'sl_wins_pc': '29.27', 'sl_winplace': '48.78', 'date_to': '20 November 2013', 'sl_fourth': '2', 'stat_type': u'Jockeys', 'region': 'South Africa ONLY', 'sl_stake_earned': 'R690 750'}, {'sl_no': '2', 'sl_runs': '41', 'sl_name': 'Marcus A', 'sl_wins': '12', 'sl_level': '-8.70', 'country': 'SA', 'date_from': '01 November 2013', 'sl_third': '3', 'sl_place': '2', 'sl_second': '3', 'stat_desc': u'Top Jockeys in South Africa ONLY 01 November 2013 to 20 November 2013', 'sl_wins_pc': '29.27', 'sl_winplace': '48.78', 'date_to': '20 November 2013', 'sl_fourth': '2', 'stat_type': u'Jockeys', 'region': 'South Africa ONLY', 'sl_stake_earned': 'R690 750'}]

如您所见,它使用sl_no 1打印第一个对象,然后将其添加到列表

然后它用sl_no 2打印对象但是然后列表中的两个对象都是2,而不是1和2 a我本来期望它...所以在迭代结束时整个列表只有最后一个对象在多次迭代发生的时候?

为什么会这样?

2 个答案:

答案 0 :(得分:3)

问题是obj每次都是同一个对象。您可以多次将它附加到列表json,因此这是一个包含对同一对象的多个引用的列表。 obj会随着时间的推移而发生变化,然后如果您打印列表,则会看到多次打印出相同的对象。

使用

obj = tags.copy()

每次都使obj成为一个 new 对象(不仅仅是对与tag相同的对象的引用,而是对具有相同内容的新字典的引用)。因此,对此obj的更改只会影响此对象。

答案 1 :(得分:2)

由于

而发生此行为
    obj = tags

实际上,您正在每次迭代时编辑tags的内容,从而产生一个包含重复行的数组。

要解决您的问题,只需在每次迭代时创建tags的新实例。

例如:

    obj = []