Перечисление списков в 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 должна иметь такие значения, как:

 (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])) 

во время итерации, что означает, что 'L' должен иметь значения от 0 до 7 и 'M' , кортежи ([0, 1, 2], [1, 1, 2]) через ([0, 1, 2], [0, 1, 2]) . Однако, когда я запускаю этот код через отладчик, я вижу, что L и M являются списками. Например, когда i = 0, L = [0, 1, 2] and M = [1, 1, 2] и т. Д. Может кто-нибудь объяснить, что происходит?

С линией 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 получает второй список в кортеже. Надеюсь это поможет.

Конечно, L и M – списки. Если вы запустите

 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 на его элементы, которые – на первой итерации – два списка, на которые ссылаются A и B

Вышеупомянутая линия по существу означает

 (L, M) = (A, B) 

что эквивалентно

 L, M = A, B 

который, в свою очередь, означает «назначить A на L и назначить B на M ».