В чем разница между list1.append(list2) и list1.append(list2[:]) в цикле for в Python?

#python-3.x #list #for-loop #append

#python-3.x #Список #for #добавить

Вопрос:

Вот две части похожих кодов:

 s='abc'
ans,res=[],[]
for i in range(len(s)):
    ans.append(i)
    res.append(ans[:])
print(res,"n")
 

: [[0], [0, 1], [0, 1, 2]]

 ans,res=[],[]
for i in range(len(s)):
    ans.append(i)
    res.append(ans)
print("n",res)
 

: [[0, 1, 2], [0, 1, 2], [0, 1, 2]]

Меня смущает разница между этими двумя результатами. Почему res.append(ans) и res.append(ans[:]) приводит к другому возвращаемому значению?

Может ли кто-нибудь дать мне несколько намеков или подсказать какую-нибудь основную логику, которую я проигнорировал?

Ответ №1:

 s='abc'
ans,res=[],[]
for i in range(len(s)):
    ans.append(i)
    res.append(ans[:])
print(res,"n")
 

Это добавляется ans как следующий элемент списка. Если вы увидите, как ans это делается, и res измените каждую итерацию, вы поймете, как это работает.
Изменения:

 Iteration-0                   
ans- [0]
res- [[0]]

Iteration-1
ans- [0, 1]
res- [[0], [0, 1]]

Iteration-2
ans- [0, 1, 2]
res- [[0], [0, 1], [0, 1, 2]]
 

И для другого:

 ans,res=[],[]
for i in range(len(s)):
    ans.append(i)
    res.append(ans)
print("n",res)
 

Это перезаписывает полный список на каждой итерации, например:

 Iteration-0
ans- [0]
res- [[0]]
Iteration-1
ans- [0, 1]
res- [[0, 1], [0, 1]]
Iteration-2
ans- [0, 1, 2]
res- [[0, 1, 2], [0, 1, 2], [0, 1, 2]]