2017-02-02 8 views
0

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

Вот пример:

list_a = [0, 1, 2] 
list_b = [list_a, 3, 4] 
list_c = [6, 7] 
list_d = [8, 9] 
lists = [0, list_b, 5, list_c, list_d] 
#As you can see, lists are of varying length, and sometimes nested multiple times. 

print(lists) 
Out>>> [0, [[0, 1, 2], 3, 4], 5, [6, 7], [8, 9]] 

#Currently, I'm saving the important items of "lists" in the first item, like this: 
lists[0] = lists[1:] 

#Then I edit the values of various items, like this: 
lists[1][0][2] = 0 
lists[2] = 0 
lists[3][1] = 0 
lists[4][1] = 0 

print(lists[1:]) 
Out>>> [[[0, 1, 0], 3, 4], 0, [6, 0], [8, 0]] 

#Then I try to reset those values to the originals that I stored in lists[0] 
lists[1:] = lists[0] 

print(lists[1:]) 
Out>>> [[[0, 1, 0], 3, 4], 5, [6, 0], [8, 0]] 

Как вы можете видеть, этот метод работает для списка [2], так как этот элемент является значением, а не вложенный список. Кажется, что даже если я использую [1:], чтобы сделать копию в списках [0], ссылки на вложенные списки - это то, что скопировано, а не значения в этих вложенных списках.

Как правильно скопировать значения списков [1:] в списки [0], а затем вернуться назад, не имея обеих копий, ссылающихся на один и тот же индекс?

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

ответ

0

Использование persistent data structures. Избежание мутации позволяет увеличить общий доступ и избегать призрачных действий на таком расстоянии.

Например:

>>> from pyrsistent import pvector 
>>> list_a = pvector([0, 1, 2]) 
>>> list_b = pvector([list_a, 3, 4]) 
>>> list_c = pvector([6, 7]) 
>>> list_d = pvector([8, 9]) 
>>> lists = pvector([0, list_b, 5, list_c, list_d]) 
>>> print(lists) 
pvector([0, pvector([pvector([0, 1, 2]), 3, 4]), 5, pvector([6, 7]), pvector([8, 9])]) 
>>> lists = lists.set(0, lists[1:]) 
>>> lists = lists.transform([1, 0, 2], 0) 
>>> lists = lists.transform([2], 0) 
>>> lists = lists.transform([3, 1], 0) 
>>> lists = lists.transform([4, 1], 0) 
>>> print(lists[1:]) 
pvector([pvector([pvector([0, 1, 0]), 3, 4]), 0, pvector([6, 0]), pvector([8, 0])]) 
>>> lists = lists[:1] + lists[0] 
>>> print(lists[1:]) 
pvector([pvector([pvector([0, 1, 2]), 3, 4]), 5, pvector([6, 7]), pvector([8, 9])]) 
>>> 

Кроме того, Python имеет не-список переменных. Первый элемент списка случайных значений - странное место для «сохранения» вещей. Учитывая вышеизложенное, вы можете просто сохранить исходные значения в другой переменной. Например:

>>> list_a = pvector([0, 1, 2]) 
>>> list_b = pvector([list_a, 3, 4]) 
>>> list_c = pvector([6, 7]) 
>>> list_d = pvector([8, 9]) 
>>> lists = original = pvector([list_b, 5, list_c, list_d]) 

Теперь вы можете розыгрыши с lists и когда это надоест, lists = original приносит вам обратно в исходное состояние.

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

  • Нет связанных вопросов^_^