2017-01-29 1 views
-3

В Python все должно быть представлено указателем. Поэтому я ожидал следующий код, чтобы изменить первоначальный список a, как хорошо, так как я думал, что список copy будет содержать все оригинальные указатели, содержащиеся в a:Почему операции с копией списка не изменили элементы в исходном списке?

import copy 

a = ["a", "a"] 

copy = copy.copy(a) 
for (count, e) in enumerate(copy): 
    copy[count] += "b" 

print copy 
print a 

Я ожидал увидеть ["ab", "ab"]. Удивительно, но a по-прежнему содержит ["a", "a"] только в то время как copy действительно содержит ["ab", "ab"]. Использование copy = list(a) тоже не работает.

Я думал, что этот результат случится, если я напишу copy = copy.deepcopy(a).

Где я ошибался? Каков надлежащий способ получения ссылок на все элементы в списке и их изменение в зеркальном списке? Или это просто невозможно в Python?

+0

Строки неизменяемы? – Zizouz212

+0

Строки неизменяемы. – chepner

+0

@chepner Ударьте вас на 3 секунды: P – Zizouz212

ответ

1

Вы в замешательстве. Вся цель использования copy.copy состоит в том, чтобы создать новый список без ссылки на старый. Если вы хотите сохранить ссылку, не копируйте ее:

a = ["a", "a"] 
copy = a 
+0

Спасибо. Это действительно отвечает на мой вопрос. Итак, что же такое разница между 'copy' и' deepcopy' в этом случае? –

+1

@JIXiang Copy создаст новый список, но все элементы внутри этого списка будут одинаковыми. Deepcopy попытается воссоздать эти элементы. – Zizouz212

+1

@JIXiang: не будет никакой практической разницы, если элементы в списке не изменяются, что в данном случае они не являются. – BrenBarn

Смежные вопросы