我一直在寻找一个简洁的解释下面发生了什么,但到目前为止还没有运气。
为什么,当你尝试以下操作时:
mylist = ["a","b","c","d"]
for index, item in mylist:
print item
我得到这个错误:
ValueError: need more than 1 value to unpack
但当我尝试:
for item in mylist:
print item
返回:
a
b
c
d
如果索引是列表结构的一部分,为什么我不能把它们和项一起打印出来?
我理解这个问题的解决方案是使用enumerate()
,但我很好奇为什么通过列表迭代(不使用enumerate()
)以这种方式工作并返回ValueError
。
我认为我不理解的是:如果你可以通过使用它们的索引在列表中找到项目(例如item = L[index]
的情况)-这是否意味着在某种程度上,索引是列表作为数据结构的固有部分?或者item = L[index]
真的只是一种让Python使用索引(显然从0开始)对列表中的项进行计数的方法?换句话说,item = L[index]
正在对列表中的项目"应用"索引,从0开始。
如果索引是list结构的一部分…
除非他们不是。当你遍历列表时就不会。索引变成了时间/发生的问题,它们不再与元素本身相关联。
如果您实际将enumerate()
函数的结果作为列表打印出来:
print(list(enumerate(["a","b","c","d"])))
你会看到这样:
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
因此,如果您想使用enumerate()
打印索引和该索引处的项,您可以技术上这样写:
for pair in enumerate(mylist):
print pair[0], pair[1]
然而,这不是最好的(即。 python)做事的方式。Python可以让你把上面的代码写得更漂亮,像这样:
for index, item in enumerate(mylist):
print index, item
这是有效的,因为当您使用index, item
语法时,您告诉Python通过单独处理每个对的组件来"解包"该列表中的每个对。
有关这个元组解包魔法的更多信息,请参见:for循环中的元组解包