将对象附加到循环中的列表不是我所期望的

2024-04-18 21:28:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我将一个对象附加到如下列表中:

    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'}]

如您所见,它打印第一个slu no为1的对象,然后将其添加到列表中

然后它打印带有slu no 2的对象,但是列表中的两个对象都是2,而不是我预期的1和2a。。。所以在迭代结束时,整个列表只有迭代次数中的最后一个对象??你知道吗

为什么会这样?你知道吗


Tags: to对象nonameinonlydateruns
2条回答

问题是obj每次都是同一个对象。您将它附加到列表json几次,那么这就是一个包含许多对同一对象的引用的列表。obj随着时间的推移而变化,如果打印列表,您会看到同一对象被打印了好几次。你知道吗

使用

obj = tags.copy()

相反,每次都使obj成为新的对象(不仅仅是引用与标记相同的对象,而是引用具有相同内容的新词典)。所以对这个对象的更改只会影响这个对象。你知道吗

这种行为的发生是因为

    obj = tags

实际上,您在每次迭代时都在编辑tags的内容,从而生成一个包含重复行的数组。你知道吗

要解决您的问题,只需在每次迭代中创建一个tags的新实例。你知道吗

例如:

    obj = []

相关问题 更多 >