2017-02-12 14 views
0

Любая помощь будет принята с благодарностью !!!Проблема с pop() и append()

res = [] 
s = [1,2,3,4,5,6] 
s.pop() 
res.append(s) 
print res 
s.pop()                     
res.append(s) 
print res 

Приведенный выше код Python дает следующий результат

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

Я не понимаю, почему поп-на с будет влиять Рез. Я имею в виду результат печати должен быть

[[1,2,3,4,5]] 
[[1,2,3,4,5],[1,2,3,4]] 
+0

Вы работаете с * тот же список *. Вы добавили 's' в' res' * дважды *, но все равно ** тот же список ** –

+0

Перед добавлением s в res я вывожу последний элемент в s. Таким образом, два элемента в res должны быть разными, не так ли? – n00d1es

ответ

0

Это нормально - поскольку res будет содержать те же самые в качестве s (к тому же объекту - в данном случае массиву).

Для решения этой проблемы используйте:

res = [] 
s = [1,2,3,4,5,6] 
s.pop() 
res.append(list(s)) 
print res 
s.pop() 
res.append(list(s)) 
print res 

также взглянуть на:

How to clone or copy a list?

python: Appending a dictionary to a list - I see a pointer like behavior

+0

спасибо за ссылки. @ Dozon Higgs – n00d1es

0

Каждое значение в Python является ссылка (указатель) на объект. Назначение всегда копирует значение (которое является указателем); два таких указателя могут таким образом указывать на один и тот же объект.

Чтобы получить нужный результат вам нужно скопировать исходный список:

res = [] 
s = [1,2,3,4,5,6] 
s.pop() 
res.append(s[:]) 
print(res) 
s.pop() 
res.append(s[:]) 
print(res) 

То же самое можно сделать с помощью list.copy() функции:

... 
res.append(s.copy()) 
... 

Выход:

[[1, 2, 3, 4, 5]] 
[[1, 2, 3, 4, 5], [1, 2, 3, 4]] 
+0

Спасибо, @RomanPrekhrest. Теперь я понимаю. – n00d1es