Непонятное присвоение листа

 
0
 
Python
ava
sgrey | 23.10.2011, 07:14
После выполнения комманд в приведённом коде, почему-то при последней команде меняется L. Т.е. получается что значение в листе q также присваивается в последний вложенный эелемент в L. Не могу понять почему так происходит? или это какой-то хак в питоне?

L = [24, None]

t = [13, None]
t[1] = L
L = t

t = [28, None]
t[1] = L[1]
L[1] = t # вот здесь L = [13, [28, [24, None]]]

t = [3, None]
p = L
while p != None :
q = p
p = p[1]

q[1] = t #вот здесь происходит модификация L, [13, [28, [24, [3, None]]]]

Kommentare (4)
ava
Stolzen | 23.10.2011, 09:58 #
если нужно скопировать (склонировать) массив, используйте slice:

q = p[:]

Тогда и не будет модификации листа.
ava
sgrey | 23.10.2011, 18:07 #
мне нужно понять почему так просиходит. указателей в коде вроде бы нет, сам лист L вообще не трогается - почему при присвоении значения к q, также меняется L ?
ava
cutwater | 24.10.2011, 07:21 #
Цитата (sgrey @ 23.10.2011, 17:07 findReferencedText)
мне нужно понять почему так просиходит. указателей в коде вроде бы нет, сам лист L вообще не трогается - почему при присвоении значения к q, также меняется L ?


Указатели вроде бы нет, зато есть ссылки.
Потому что внезапно в python все есть ссылка, и L, t - ссылки и элементы списков тоже ссылки.
ava
sgrey | 24.10.2011, 13:28 #
вроде понял - когда присваем полностью новое значение к любому листу - то все данные остаются, но если меняем елемент - на него сохраняется ссылка. Спасибо. Забыл про это совсем
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden