Страницы

Поиск по вопросам

суббота, 1 февраля 2020 г.

Смысл фразы “Инструкция присваивания создаёт ссылку на объект”

#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



Это значит, что копия создается в момент изменения, а не присваивания.

Комментариев нет:

Отправить комментарий