2016-05-30 3 views
-2

Почему этот код выхода {'a': [1, 3, 4, 5, 6, 7, 8, 9], 'b': [1, 3, 4, 5, 6, 7, 8, 9]}Изменение списка внутри словарей

adic = {} 
main_array = [1,2,3,4,5,6,7,8,9] 
adic["a"] = main_array 
adic["b"] = main_array 
array = adic["a"] 
array.remove(2) 
print(adic) 

Я даже не назначая новый массив ключа. Почему 2 должен автоматически удаляться из всех массивов в словаре. Я пропустил что-то жизненно важное?

+0

Каков ваш ожидаемый результат? Также см. [Как клонировать или копировать список в Python?] (Http://stackoverflow.com/q/2612802) –

+1

«Я даже не назначаю новый массив ключу»: вот в чем смысл! Нет нового массива, в вашем полном коде есть только один (изменяемый!) Объект 'list'. – schwobaseggl

+0

Я не ожидал изменения массивов в словаре. Я ожидал, что он изменится, как только я переназначил массив на ключ – user2273795

ответ

0

Причина, по которой ваш вывод работает, из-за строк, в которых вы устанавливаете каждый из этих операторов, указывает на тот же адрес памяти вашего основного_фактора, поэтому, когда вы делаете array = adic["a"], это также указывает на тот же адрес памяти и когда вы удаляете 2, он удаляет 2 из main_array. Поскольку вы удаляете из main_array, все, что указывало на main_array, также затрагивается.

+0

Спасибо, что я искал. Есть ли у вас какие-либо решения относительно того, как я могу достичь того, что я пытаюсь сделать, и это изменяет только один массив? – user2273795

+0

В настоящее время у вас есть только один список (массивы - это списки на Python), поэтому любые сделанные вами изменения повлияют на все ссылки на один и тот же список. Если вы хотите, чтобы один список был другим, вам нужно скопировать исходный список, для которого была предоставлена ​​ссылка. –

+0

вы можете сделать следующее, чтобы изменить только один массив. 'second_array = copy.deepcopy (main_array)' – Seekheart

1

Все ваши ссылки указывают на тот же список, как вы можете проверить, добавив:

print(id(adic["a"])) 
print(id(adic["b"])) 
print(id(array)) 
print(id(main_array)) 

На моей системе:

32707888 
32707888 
32707888 
32707888 

Назначение не создает копию.

Есть несколько способов, чтобы скопировать список, если это то, что вы хотите, такие как

new_list = list(old_list) 

обсуждавшихся here.

+0

Я не пытался копировать список. То, что я пытался сделать, это вынуть массив, который был назначен «a». Затем я удалю число из массива и переназначаю его на «a» еще раз. Однако я не мог понять, почему он не работает и вместо этого удаляет номер из всех массивов. – user2273795

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