Проблема при вставке / добавлении в список списков - PullRequest
0 голосов
/ 14 апреля 2020

Когда я запускаю следующий код с n = 2, я получаю answer = [[2, 2, 2], [1, 2], [2, 2, 2]].

n = int(input())  
answer = [[1]]  
for i in range(2, n+1):
    t = [i]*((2*i)-3)  
    answer.insert(0, t)  
    answer.append(t)     
    for a in answer:
        a.insert(0,i)

print(answer)

Мне нужно было [[2,2],[2,1],[2,2]].

Почему insert() добавляет дополнительные 2 в первый и последний список?

То же самое происходит с a.append(i).

1 Ответ

2 голосов
/ 14 апреля 2020

Это происходит потому, что answer [0] и answer [2] ссылаются на один и тот же объект, т.е. Если вы вносите изменения, чтобы ответить [0] или ответить [2], вы фактически вносите изменения в t, и, поскольку оба ссылаются на него, t будет изменен дважды, отсюда и неожиданный результат. Попробуйте использовать библиотеку копирования или используйте [i] * ((2 * i) -3) непосредственно при вставке и добавьте вместо этого.

n=int(input())  
answer=[[1]]  
for i in range(2, n+1):
    answer.insert(0, [i]*((2*i)-3))  
    answer.append([i]*((2*i)-3))     
    for a in answer:
        a.insert(0,i)

print(answer)

или

import copy

n=int(input())  
answer=[[1]]  
for i in range(2, n+1):
    t = [i]*((2*i)-3)
    answer.insert(0, copy.copy(t))  
    answer.append(copy.copy(t))     
    for a in answer:
        a.insert(0,i)

print(answer)
...