Python всегда работает по ссылке, если вы явно не запросите копию (фрагмент встроенного списка считается «запросить копию», но фрагмент массива также работает по ссылке). Однако именно из-за этого alist=anotherlist; alist.sort()
означает сортировку объектов одного списка (с двумя эквивалентными именами alist
и anotherlist
) - вы не можете поддерживать два разных порядка в одном и том же объекте списка одновременно.
Итак, в этом случае вы должны явно запросить копию (например, alist=list(anotherlist)
) - и как только вы это сделаете, между двумя различными объектами списка больше не будет связи. У вас не может быть обоих способов: либо вы работаете по ссылке (и у вас есть один объект списка и, следовательно, один порядок!), Либо вы делаете копию (в этом случае вы получаете два отдельных объекта списка).
Вы можете воспользоваться тем фактом, что до сих пор обсуждались копии мелкие - объекты (предметы), к которым два списка относятся к , одинаковы ... до и если вы не выполняете удаление, добавление или переназначение элементов в любом списке (с другой стороны, мутация изменяемых элементов не изменяет это соединение: это совершенно отдельная и кардинально отличная ситуация от любой из вышеперечисленных поскольку удаления, добавления и переназначения являются операцией в списке , в то время как вызов метода с мутацией над элементом является операцией над элементом - элементы не обращают внимания на любые операции с одним или другие списки ссылаются на них, списки не обращают внимания ни на какие операции с одним или несколькими элементами, на которые они ссылаются).
Вы ничего не можете сделать с удалениями и добавлениями, за исключением хранения двух списков, обернутых и синхронизированных в одном объекте, как предлагается в других ответах; но для переназначения предметов, если это все, что вам нужно, вы можете превратить их в мутацию предметов, добавив один уровень косвенности - вместо того, чтобы иметь список, непосредственно ссылающийся на предметы напишите, например, в одноэлементные списки. Например:
>>> alist = list([x] for x in 'ciao')
>>> blist = list(alist)
>>> blist.sort()
>>> alist
[['c'], ['i'], ['a'], ['o']]
>>> blist
[['a'], ['c'], ['i'], ['o']]
>>> blist[-1][0] = 'z'
>>> blist
[['a'], ['c'], ['i'], ['z']]
>>> alist
[['c'], ['i'], ['a'], ['z']]
Может ли эта концепция дополнительного уровня косвенности вообще помочь с тем, что вы точно пытаетесь сделать, только вы можете сказать, поскольку мы на самом деле не знаем , что вы 1033 * пытаются сделать; -).