任何人都可以解释这里发生的事情,因为我感到很沮丧
我有一个模块范围的列表变量,其元素包含字段 - mylist with' n'条目,每个field1,field2..fieldx
我想在一个过程中访问它们,所以(有一些trace / debug语句)
class
第一个print语句给出值-4(这是正确的),第二个给出一个不同的值,0,在一个简单的一个语句步骤。 在我看来,lField被创建为具有默认值的新元素,但我不知道,也不理解为什么。为什么第二个print语句给出的值与第一个不同?
我做错了什么?或者,可能更有针对性,我不理解的是什么?
我在另一个论坛上问了这个问题,但没有人提出合理的解释。
答案 0 :(得分:2)
在enumerate()
中,start
未指定迭代的起始索引。它指定计数的起始值。 enumerate()
遍历整个iterable,从第一个(索引0)到最后一个元素,无论start
参数如何。
循环中的第一个print
语句打印mylist[0].dataFieldCheckType
,就像它应该的那样。你只是希望它是mylist[1].dataFieldCheckType
。
如果你想从第二个(索引1)开始获取列表的所有元素,只需将其切片:
mylist[1:]
如果您确实需要索引,请将切片与enumerate()
组合:
enumerate(mylist[1:], start=1)
答案 1 :(得分:2)
enumerate
为每个(index + start, value)
迭代产生value
个元组。可选的start
参数用作 offset 值来计算生成的元组的第一个元素:
>>> a = ['hi', 'stack', 'overflow']
>>> for x in enumerate(a, -4):
... x
...
(-4, 'hi') # 0 + (-4)
(-3, 'stack') # 1 + (-4)
(-2, 'overflow') # 2 + (-4)
如果你想跳过一个可迭代的元素,但不想在内存中使用那个特定的片(你想做的就是迭代),使用itertools.islice
:
>>> from itertools import islice
>>> for x in islice(a, 2, None):
... x
...
'overflow'
当然,你可以将两者结合起来,以实现正义。
>>> for x in islice(enumerate(a), 0, 2):
... x
...
(0, 'hi')
(1, 'stack')