考虑以下代码:
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()
当前元素来收集其键和值)
答案 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>
将键值对作为元组列表返回,而不会从字典中删除。