-1

您好,我发现了一个有趣的片段:

seq = ["one", "two", "three"] #edited
for i, element in enumerate(seq):
    seq[i] = '%d: %s' % (i, seq[i])

>>> seq
['0: one', '1: two', '2: three']

我想知道python是如何做到的......对我来说元素应该是未定义的......但显然它不是......python在这里做什么?

非常感谢!

4

4 回答 4

3

enumerate本质上将输入列表的每个元素转换为元组列表,其中第一个元素作为索引,元素作为第二个元素。enumerate(['one', 'two', 'three'])因此变成[(0, 'one'), (1, 'two'), (2, 'three')]

紧随其后的位for分配给枚举中每个元组的i第一个元素和第二个元素。element因此,例如在第一次迭代中,i == 0and element == 'one',您只需通过其他元组来获取其他迭代的值。

于 2013-01-24T11:09:27.773 回答
2

enumerate函数的实际定义是这样的

enumerate(iterable[, start]) -> iterator for index, value of iterable

Return an enumerate object.  iterable must be another object that supports
iteration.  The enumerate object yields pairs containing a count (from
start, which defaults to zero) and a value yielded by the iterable argument.
enumerate is useful for obtaining an indexed list:
    (0, seq[0]), (1, seq[1]), (2, seq[2]), ...

但是如果未定义参数 seq 将不会返回所需的输出,而是会抛出一个错误,例如 - NameError: name 'seq' is not defined。

于 2013-01-24T11:15:46.427 回答
1

我不确定你想要什么,知道枚举或这里发生了什么。这可能会有所帮助:

seq = ["one", "two", "three"]
for i range(3):
    seq[i] = '%d: %s' % (i, seq[i])

>>> seq
 ['0: one', '1: two', '2: three']

实际上,这里的“seq”是列表类的对象。列表中的每个元素都引用了不同类的独立对象。在上述功能时;首先通过访问“seq[i]”获取每个列表元素对象的引用,使用引用的对象值创建一个新对象(可以属于其他类),现在你再次将“seq[i]”引用到新创建的每个元素的对象。

于 2013-01-24T11:56:35.530 回答
0

你说的对。seq 未定义。您的代码段将不起作用。只有在 seq 之前设置为 seq = ['one', 'two', 'three'] 时它才会起作用。去尝试一下!

于 2013-01-24T11:09:01.423 回答