2013-11-26 74 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