python 3.1中的for循环索引

时间:2013-06-14 14:51:23

标签: for-loop python-3.x indexing

我无法理解for循环中的行为.index方法 (Python 3.3.1(v3.3.1:d9893d13c628,2013年4月6日,20:30:21)[MSC v.1600 64位(AMD64)] on win32)

L = [e for e in range(11)]
print(L)
for e in L[:]:
    print(e, L.index(e))
    L[L.index(e)] *= e
print(L)

输出:

>>> 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
0 0
1 1
2 2
3 3
4 2
5 5
6 6
7 7
8 8
9 3
10 10
[0, 1, 16, 81, 4, 25, 36, 49, 64, 9, 100]
>>> 

我期待最终名单[0,1,4,9,16,25,36,49,64,81,100]

1 个答案:

答案 0 :(得分:3)

当您点击4时,您的列表为[0, 1, 4, 9, 4, 5, 6, 7, 8, 9, 10],已替换前3个元素。 .index()找到4第一次出现,在索引2处,而不是5,正如您所期待的那样。同样适用于9;您已在循环中使用3替换9L.index(9)返回3而不是10

请勿在更改列表中使用list.index();改为使用enumerate()

L = [e for e in range(11)]
print(L)
for i, e in enumerate(L[:]):
    print(e, i)
    L[i] *= e
print(L)

然后导致:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

您可以使用简单的[e for e in range(11)]替换list(range(11))。您可以用以下内容替换整个脚本:

[e * e for e in range(11)]