2013-10-10 4 views
1

Я понимаю, что из-за того, как работает Python x = []; y = x; x.append(1); y будет печатать [1]. Однако, наоборот, скажем,Как я могу присвоить значение в python

z = [1,2] 
temp = z 
temp[1] = 3 
z,temp 

напечатает ([1,3],[1,3]). Если я правильно понял, то и z, и temp указывают на один и тот же список, поэтому изменение одного изменит другое, видя, что списки изменяемы. Как я могу предотвратить это? А именно, я хочу сделать цикл for, который скопирует z в temp, изменит его по-разному и вытолкнет его в очередь. Для этого необходимо, чтобы z содержал базовый массив, поэтому мне нужно, чтобы смена temp не изменилась. z.

EDIT: Я попытался сменить z на кортеж так, чтобы z=z,, а затем позвонил z[0] вместо z. Тем не менее это не решает мою проблему.

+0

Технически, Python - это только пропускная способность - разница, которую вы видите, больше между изменяемыми и неизменяемыми типами. Что касается вашего вопроса: вы можете создать копию списка, например. 'newlist = oldlist [:]'. – miku

+0

Возможный дубликат [Создание переменных Python, которые не зависят друг от друга] (http://stackoverflow.com/questions/16362617/creating-python-variables-that-are-independent-of-each-other) – geoffspear

+2

@miku Нет , изменчивость не имеет ничего общего с назначением, просто создавая другую ссылку. После 'a = b',' a is b' всегда * true, независимо от того, какие типы задействованы. Единственное, что влияет на изменчивость, - это то, как легко наткнуться на этот факт. – delnan

ответ

7

Копирование списка легко ... Просто нарезать его:

temp = z[:] 

Это создаст неполную копию - мутации элементов в списке будут отображаться в элементах в z, но не изменения temp напрямую.


Для более общих целей, питон имеет copy модуль, который вы можете использовать:

temp = copy.copy(z) 

Или, возможно:

temp = copy.deepcopy(z) 
+0

В этом конкретном случае я фактически работаю с классом POD с 3 списками. Модуль 'copy' работает как шарм. Благодарю. – andrepd

4

Почему бы не сделать tempкопия из z :

>>> z = [1, 2] 
>>> temp = z[:] 
>>> temp[1] = 3 
>>> z 
[1, 2] 
>>> temp 
[1, 3] 
>>> 

[:] легко делает мелкую копию списка.

Вы также можете быть заинтересованы в copy.copy и copy.deepcopy, оба из которых состоят из модуля copy Python.

+0

В этом конкретном случае я фактически работаю с классом POD с 3 списками. Модуль копирования работает как шарм. Благодарю. – andrepd

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