迭代的当前元素与迭代器有何关系?

时间:2019-07-12 19:47:32

标签: python python-3.x iterator

考虑以下代码:

mylist = [
    {'a': 1},
    {'b': 2},
]

for el in mylist:
    print(mylist)
    x, y = el.popitem()
    print(x, y)

我希望mylist不会在迭代过程中发生变化(因此在打印时每次都会相同),因为在我处理的是当前迭代元素的变量上,为什么要这么做呢?

输出为

[{'a': 1}, {'b': 2}]
a 1
[{}, {'b': 2}]
b 2

这意味着弹出迭代的当前值会影响迭代器本身。为什么会这样呢? (我猜这是因为当前元素是指向列表中元素的指针)

我应该如何迭代,以使迭代列表不变? (我需要popitem()当前元素来收集其键和值)

2 个答案:

答案 0 :(得分:0)

您正确的认为el变量是对列表中值的引用。

您可以使用.items()从词典中获取键值对

mydict = [
    {'a': 1},
    {'b': 2},
]

for el in mydict:
    print(mydict)
    x, y = list(el.items())[0] # This assumes that you only have 1 pair in the list, otherwise it will return the first one
    print(x, y)

答案 1 :(得分:0)

调用mylist = [ {'a': 1}, {'b': 2}, ] for el in mylist: print(mylist) # First iteration: [{'a':1},{'b':2}] # Second iteration: [{},{'b':2}] because the first iteration removed el ({'a':1}) x, y = el.popitem() # Remove the items from the dict el print(x, y) 时,您正在修改的是元素(dict),因此当您第二次打印时,该元素为空。

el

dict只是指向元素的指针,因此,如果您对其进行修改,则会在包含列表中对其进行修改。

您始终可以使用for el in mylist: print(mylist) #x, y = el.items()[0] # Python 2 x, y = list(el.items())[0] # Python 3 print(x, y) 的{​​{3}}方法:

items

<table id="documentTable"> <tr> <% for (var i=0; i<obser.length; i++) {% <tr> <td><%=obser[i].type%></td> <td><%=obser[i].code.naming[0].display%></td> <% if (obser[i].valueQuantity && obser[i].valueQuantity.value) { %> <td><%=obser[i].valueQuantity.value%></td> <% } else { %> <td></td> <% } %> </td> ... </table> 将键值对作为元组列表返回,而不会从字典中删除