了解带/不带枚举()的"ValueError: need more than 1 value to unpack"



我一直在寻找一个简洁的解释下面发生了什么,但到目前为止还没有运气。

为什么,当你尝试以下操作时:

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循环中的元组解包

相关内容

最新更新