2013-10-13 3 views
5
array1=[0,1,2] 
array2=array1 
array2[0]=234234 
print array1 

ВЫВОД:Установка двух массивов равных

[234234, 1, 2] 

Почему изменение питон "array1? Не следует ли просто изменить массив2? Как я могу запретить python изменять массив1 при изменении array2?

+3

Добро пожаловать в StackOverflow. Не беспокойтесь слишком много о downvoters - некоторые люди думают, что каждый дублированный или начинающий вопрос должен быть опущен. Но, кроме того, что это дубликат, это прекрасный вопрос: ясно, в чем вопрос, и он показывает убедительный код, который наглядно демонстрирует проблему. – kojiro

ответ

4

Используйте ломтик обозначения для копирования, как этого

array2 = array1[:] 

Или вы можете использовать list функцию

array2 = list(array1) 

При назначении одного списка в другой список, новый список не будет создан, но как переменные будут отправлены в тот же список. Это можно подтвердить с помощью этой программы.

array1 = [1, 2, 3, 4] 
array2 = array1 
print id(array1), id(array2) 

Они оба напечатают один и тот же идентификатор. Это означает, что они оба одинаковы (если вы находитесь на фоне C, вы можете думать о них как о указателях (в реализации CPython они действительно являются указателями, другие реализации выбирают для печати уникальных идентификаторов - пожалуйста, отметьте комментарий kojiro)). Узнайте больше о idhere. Когда вы сделаете

array3 = array1[:] 
array4 = list(array1) 
print id(array1), id(array3), id(array4) 

Вы получите разные идентификаторы, так как в этих случаях будут созданы новые списки.

+0

+1 FWIW, что 'id' как указатели - это деталь реализации, специфичная для CPython. Если интерпретатор Python отличается, они могут и не быть. Но в этом случае они все равно будут иметь одинаковую ценность, даже если это значение не является адресом памяти в списке. – kojiro

+0

omg thank u i own u моя жизнь. также был человеком, который меня ниспровергал, потому что, если это так, я определенно рассмотрю вопрос о втягивании предыдущего заявления. – user2875270

+0

@ пользователь2875270 Нет. Я не сделал ни единого слова :) Это вопрос начинающих, который у всех нас был. Итак, я просто указал, что на этот вопрос уже был дан ответ в другом потоке. – thefourtheye

2

array1 и array2 - это два имени для одного и того же списка, так как вы их устанавливаете. Если вы не хотите этого, скопировать список, используя один из следующих способов:

array2 = array1[:] 
array2 = list(array1) 
10

array1 и array2 являются тем же объектом. Вот почему изменение либо меняет другой. Если вы хотите копию объекта, вот один из способов сделать это:

array2 = array1[:] 

См more on this here.

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