2017-05-27 136 views
2

下面的代碼片段是從代碼跟蹤演習。列表枚舉在Python

import copy 

def ct1(A, B, C, D, E): 
    result = [ ] 
    # 0 1 2 3 4 5 6 7 8 9 
    pairs = [(A,B),(A,C),(A,D),(A,E),(B,C),(B,D),(B,E),(C,D),(C,E),(D,E)] 
    for i,pair in enumerate(pairs): 
     (L, M) = pair 
     if (L is M): result.append(i) 
     elif (L == M): result.append(10*i) 

    return result 
def f(L): 
    L[0] += 1 
    return L 

A = list(range(3)) 
B = copy.copy(A) 
C, D, E = A, B+[ ], f(B) 
print(ct1(A, B, C, D, E)) 

我很困惑的部分是for循環中使用的枚舉。從enumerate()的文檔,它看起來像pair應該有有這樣的值:迭代,這意味着'L'應通過([0, 1, 2], [0, 1, 2])通過7'M',元組([0, 1, 2], [1, 1, 2])具有0值時

(0, ([0, 1, 2], [1, 1, 2])) 
(1, ([0, 1, 2], [0, 1, 2])) 
(2, ([0, 1, 2], [0, 1, 2])) 
(3, ([0, 1, 2], [1, 1, 2])) 
(4, ([1, 1, 2], [0, 1, 2])) 
(5, ([1, 1, 2], [0, 1, 2])) 
(6, ([1, 1, 2], [1, 1, 2])) 
(7, ([0, 1, 2], [0, 1, 2])) 

。但是,當我通過調試器運行此代碼時,我看到LM都是列表。例如,當i = 0, L = [0, 1, 2] and M = [1, 1, 2]等等。有人可以解釋發生了什麼嗎?

+1

上'unpacking'讀了起來,從'枚舉元組()'已經被解壓到'i'和'pair'。你可以嵌套解包,所以你可以寫'for i,(L,M)枚舉(對):'而不需要'pair'。 – AChampion

+0

現在對我有意義!謝謝你的幫助。 – theguyoverthere

回答

0

隨着線for i,pair in enumerate(pairs):i獲取列表pairs的指標值和從0到9而pair從列表pairs逐一得到的值。所以對於i = 0,該pair([0, 1, 2], [1, 1, 2])。然後調用(L, M) = pair,這意味着L得到第一個列表,而M獲取元組中的第二個列表。希望這可以幫助。

0

當然LM是列表。如果你跑

pairs = [(A,B),(A,C),(A,D),(A,E),(B,C),(B,D),(B,E),(C,D),(C,E),(D,E)] 
for i, pair in enumerate(pairs): 
    print(i, pair) 

你會得到想要的結果。所以你正在尋找的元組被保存在pairs。隨着線

# ... 
(L, M) = pair 
# ... 

你分手了由pair引用到它的元素,這是元組 - 第一次迭代 - 由AB引用的兩份名單。

上述線基本上意味着

(L, M) = (A, B) 

這相當於

L, M = A, B 

這反過來又意味着 「分配給AL分配B至M」。