Странное поведение при использовании функции append() при объединении элементов в подсписке

#python #list #append

Вопрос:

Мне нужно немного света, чтобы прояснить, что происходит в этом игрушечном примере:

 A = []
X = [[1, 2, 3],[4, 5, 6]]
B = -1
for i in range(2):
    S = X[i]
    A.append(S)
    for j in range(3):
        T = S[j]
        S[j] = B
        A.append(S)
        S[j] = T

print('nFinal shape of A after completion {}'.format(A))
 

Я ожидал получить в результате A как:

 [[1, 2, 3],
 [-1, 2, 3],
 [1, -1, 3],
 [1, 2, -1],
 [4, 5, 6],
 [-1, 5, 6],
 [4, -1, 6],
 [4, 5, -1]]
 

… но я получаю это:

 [[1, 2, 3],
 [1, 2, 3],
 [1, 2, 3],
 [1, 2, 3],
 [4, 5, 6],
 [4, 5, 6],
 [4, 5, 6],
 [4, 5, 6]]
 

Комментарии:

1. A.append(S) не делает копию списка. Воспользуйся A.append(S.copy())

Ответ №1:

Вы должны использовать .copy()

 A = []
X = [[1, 2, 3],[4, 5, 6]]
B = -1
for i in range(2):
    S = X[i].copy()
    A.append(S.copy())
    for j in range(3):
        T = S[j]
        S[j] = B
        A.append(S.copy())
        S[j] = T

print('nFinal shape of A after completion {}'.format(A))
 

Комментарии:

1. Большое вам спасибо! Очевидно, пожалуйста, поправьте меня, если я ошибаюсь, когда я использую « S = X[i]`, он приписывает указатель только на S, который указывает на исходную строку в X?

2. Да, это именно так