2013-11-26 71 views
2

你可以请我解释一下,我完全迷失在这里。列表奇怪的不明原因

这是我的代码:

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] 

为什么呢?

+1

那么,什么是两个代码示例之间有什么不同?为什么会改变发生的事情? – hankd

+2

我不能说我明白这个问题的细节,但总的来说,当你迭代它时修改列表可能会导致意想不到的结果。 – Kevin

回答

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,并进一步。

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()始终返回第一垫的索引ch找到了,这就是为什么在第二种情况下,第0个索引处的项目会增加。


一个简单的解决方案由1递增的所有值将是:

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

另一种解决方案是遍历列表副本'L [:]',或使用类似'enumerate()'的东西。 – emnoor