2013-12-12 31 views
1

我追加一个对象像这样的列表:追加对象列出一个循环 - 不是我所期待

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我会已经预料到了......所以在最后迭代整个列表中只有迭代发生的次数最多的对象?

这是怎么发生的?

+0

没有它不是真的,我更新了我的问题,语法.. – Harry

+0

@Mzzl我刚提过同样的,我认为它实际上是在循环,但在这篇文章中它的粘贴错误。 – scriptmonster

+0

是的,情况是这样的:-) – Harry

回答

3

问题是obj每次都是同一个对象。您将它附加到列表json几次,那么这是一个列表,其中包含许多对同一对象的引用。 obj随时间变化,然后如果您打印列表,您会看到多次打印出相同的对象。

使用

obj = tags.copy() 

代替使各时间(而不是仅仅提及相同的对象的标签,而是一种新的字典的参考具有相同的内容)OBJ一个对象。所以对这个obj的更改只会影响这个obj。

+0

非常感谢。它看起来像copy()函数改变字典的顺序? – Harry

+0

词典没有顺序。 – RemcoGerlich

2

发生此行为是因为

obj = tags 

其实,你正在编辑的tags在每个迭代上的内容,造成与重复的行阵列上。

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

例如:

obj = []