Python ссылается на элемент в списке из другого списка - PullRequest
3 голосов
/ 01 января 2012

У меня есть список переменных (listA) из другого списка (listB).У меня проблема в том, что элементы из listB передаются по значению в listA, а не по ссылке.В любом случае я могу получить доступ к объекту в listB после помещения его значения в listA?

Например:

listB = [1,2,3,4,5]
listA = [listB[0], listB[1]]
listA[0] = 0

это делает listA равным [0, 2] и оставляетlistB без изменений.Я хотел бы изменить список B таким образом, чтобы он стал [0,2,3,4,5].

Я, конечно, нашел решение для этого, но это уродливо, и мне было интересно, если естьбыл элегантный способ сделать это.

Ответы [ 2 ]

1 голос
/ 01 января 2012

Вы не можете.Прежде всего, целые числа являются неизменяемыми и не работают как целые числа в C / C ++.Вы не можете получить указатель / ссылку на целое число, а затем изменить его (я имею в виду, вы можете, у вас всегда есть ссылка, но обычно это ссылка на один объект; проверьте это x = 1; y = 1; print id(x), id(y); значения id должны быть одинаковыми иэто адреса памяти).Что вы можете сделать, это получить индекс элементов в listB и изменить список, например:

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

Но, вероятно, вы пытаетесь сделать то, что вам не следует делать, потому что Python работает не так, как C ++.Чего ты пытаешься достичь?

1 голос
/ 01 января 2012

Все в Python является ссылкой.После того, как все эти операторы выполнены, listB[1] и listA[1] являются буквально одним и тем же объектом.(Вы можете проверить, позвонив по номеру id(listB[1]) и id(listA[1]).

Причина, по которой listA[0] и listB[0] различаются, заключается лишь в том, что вы вставили в это место другую ссылку.

Судя по вашему описанию, вам не нужен listA, в котором хранятся ссылки на объекты в listB. Вам нужен listA, то есть представление из listB. IПредположим, у вас есть только две опции:

  • Создать специальную последовательность, которая внутренне хранит ссылку на listA, и чьи методы __getitem__ и __setitem__ выполняют поиск в listA, когдаinvoked.

  • Создайте специальные специальные ссылочные типы, содержащие что-то вроде «последовательности и индекса». Поместите эти ссылки в listA. Но, чтобы изменить от listB до listAвам придется вызывать некие «get» и «set» члены этих ссылочных объектов.

...