2016-12-26 6 views
0

Давайте предположим, что я создал два различных списка:Копирование элементов из одного списка в другой в питона

listA = [0, 0, 0] 
listB = [1, 1, 1] 

Я хочу, чтобы сделать элемент в LISTB относятся к одному объекту в качестве элемента в lišta. Так что элемент в обоих списках меняется вместе.

listB[2] = listA[0] 
>>listB[2] 
>>0 

listB[2] = 2 
>>listA[0] 
>>2 

Однако делать выше просто передает значение элементов, так что списки еще со ссылкой на отдельные объекты. Есть ли способ или другая структура данных, которые могут дать мне желаемый эффект?

+1

Совпадение. Это почти что уже происходит, когда вы говорите 'listA = listB' или наоборот. Подробнее см. Здесь [здесь] (http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list). –

+0

Просто сделайте 'listA = listB', две ссылки на * один список *. Вы не можете делиться ссылками между обычными объектами списка, иначе нет. –

+0

, если вы работаете с объектами, вы можете предположить это, но не для целых чисел. – motia

ответ

1

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

>>> listA = [[0], [0], [0]] 
>>> listB = [[1], [1], [1]] 
>>> listA[0] = listB[0] 
>>> listA 
[[1], [0], [0]] 
>>> listB[0][0] = 2 
>>> listB 
[[2], [1], [1]] 
>>> listA 
[[2], [0], [0]] 

Но будьте осторожны:

>>> listB[0] = [3] 
>>> listB 
[[3], [1], [1]] 
>>> listA 
[[2], [0], [0]] 

Вы могли бы написать класс, который делает это невидимое поэтому он больше похож на список и проще использовать, не допуская ошибок.

1

Вы не можете этого сделать. Вы можете либо сделать listA, либо сами listB - это тот же объект, и в этом случае все их индексы будут отражать любые изменения, внесенные в них, или вы можете сделать их отдельными объектами, и в этом случае нет их индексов будут отражать изменения. Вы не можете сделать два списка, которые «объединены в бедро», разделяя только некоторые из их ссылок на индекс.

Предположим, что значение listB[2] - это какой-то объект под названием obj. Когда вы делаете что-то вроде listB[2] = 2, вы не меняете obj; вы меняете listB (указав свой индекс 2 на какой-то другой объект). Таким образом, вы не можете сделать listA[2] «отражать» listB[2], если listA и listB - это тот же объект. Вы можете, конечно, сделать listA[2] и listB[2] ссылкой на тот же объект, но это не повлияет на то, что происходит, когда вы делаете listB[2] = 2, потому что эта операция вообще не повлияет на этот общий объект.