#python
Сейчас изучаю python по книжке Марка Лутца. И там в главе 11 рассматривается инструкция присваивания. И у меня возникла некоторые непонимание. В книжке пишется. Инструкция присваивания создаёт ссылку на объект. Как говорилось в главе 6, в языке Python инструкция присваивания сохраняет ссылки на объекты в переменных или элементах структур данных. Они всегда созадают ссылки на объекты и никогда не создают копии объектов. Вследствие этого переменные в языке Python больше напоминают указатели, чем области хранения данных. Но вот контрпример, если касаться списков: >>> a = [1,2,3] >>> a [1, 2, 3] >>> b = a >>> b [1, 2, 3] >>> a = a + a >>> b [1, 2, 3] >>> a [1, 2, 3, 1, 2, 3] Как видно b не изменился, значит в этой операции >>> b = a была создана копия a, а не b присвоен указатель на a. То же самое и здесь: >>> k = 10 >>> l = k >>> k = 20 >>> k 20 >>> l 10 Я, видимо, что-то не так понимаю?
Ответы
Ответ 1
Все станет очевидней, если добавить "id()" в Ваш пример >>> a = [1,2,3] >>> id(a) 14342744 >>> b = a >>> id(b) 14342744 >>> a = a + a >>> id(a) 14342424 >>> id(b) 14342744 >>> id(a) == id(b) False Когда Вы делаете "a = a + a", то создается новый объект "a + a" ([1,2,3] + [1,2,3]) и ссылка на него присваивается переменной "а", однако объект [1,2,3] никуда не теряется т.к. b продолжает ссылаться на него. То же самое для второго примера, сначала k ссылается на объект типа int со значением 10, который лежит где-то-там-глубоко-в-памяти-интерпретатора, l ссылается не на k, а на тот же объект-который-далеко-в-памяти. Операция "k = 20" означает "создать в памяти объект int со значением 20 и ссылку на него присвоить переменной k", однако l продолжает ссылаться на первый int'овый объект со значением 10. Можно ещё добавить, что во многих случаях, если объект с требуемым значением уже был создан, то ещё один такой же объект создаваться не будет, и переменная будет содержать уже ссылку на ранее созданный объект.Ответ 2
Это значит, что копия создается в момент изменения, а не присваивания.
Комментариев нет:
Отправить комментарий