列出奇怪的原因不明

时间:2013-11-26 18:35:35

标签: python list

你可以向我解释一下,我完全迷失在这里。

这是我的代码:

def ff(L):
    for a in L:
        k = L.index(a)
        print(k)
        b = L.pop(k)
        g = b
        print(g)
        L.insert(k,g)

    return L

这是输出:

>>> L = [12,13,14]
>>> ff(L)
0
12
1
13
2
14
[12, 13, 14]

但是当我这样做时:

def ff(L):
    for a in L:
        k = L.index(a)
        print(k)
        b = L.pop(k)
        g = b + 1
        print(g)
        L.insert(k,g)
    return L

输出:

>>> L = [12,13,14]
>>> ff(L)
0
13
0
14
0
15
[15, 13, 14]

为什么这样?

2 个答案:

答案 0 :(得分:5)

很明显。您可以在代码中添加更多打印件,以便自己查看原因:

>>> def ff(L):
...     for a in L:
...         k = L.index(a)
...         print 'value', a, 'at', k, 'pos in', L,
...         b = L.pop(k)
...         g = b + 1
...         print 'list after pop', L,
...         L.insert(k,g)
...         print 'inserted value', g, 'list after ins', L
...     return L
...
>>> ff(L)
value 12 at 0 pos in [12, 13, 14] list after pop [13, 14] inserted value 13 list after ins [13, 13, 14]
value 13 at 0 pos in [13, 13, 14] list after pop [13, 14] inserted value 14 list after ins [14, 13, 14]
value 14 at 0 pos in [14, 13, 14] list after pop [13, 14] inserted value 15 list after ins [15, 13, 14]
[15, 13, 14]

所以你基本上寻找一个值,弹出它,在第一个位置插入值+ 1,寻找值+ 1并且进一步。

答案 1 :(得分:3)

我不确定这里的问题是什么,但是当您在第一次迭代中递增值时,第0次索引处的项目变为13.并且在第二次迭代期间L.index(13)再次返回索引0,因此在第二次迭代中迭代你再次将索引0处的项目修改为14.然后继续......

def ff(L):
    for a in L:
        print 'List', L, 'searching for', a, 'found at', L.index(a)
        k = L.index(a)
        b = L.pop(k)
        g = b + 1

        L.insert(k,g)
    return L
L = [12,13,14]
print ff(L)

<强>输出:

List [12, 13, 14] searching for 12 found at 0
List [13, 13, 14] searching for 13 found at 0
List [14, 13, 14] searching for 14 found at 0
[15, 13, 14]

因此,list.index()总是返回找到的第一个匹配的索引,这就是为什么在第二种情况下第0个索引处的项目会增加。


将所有值增加1的简单解决方案是:

>>> L = [12,13,14]
>>> [x+1 for x in L]
[13, 14, 15]