Для Python подумайте о пространстве имен как реализованном таблицей с двумя столбцами, в которой перечислены имена и адреса. Также обратите внимание, что оператор присваивания =
заставляет оценить правую сторону, представленную в памяти, если она еще не представлена, и , затем вызывает привязку переменной в левой части присваивания в таблице символов к адресу представление. Работа по вашему коду по одной строке за один раз:
listA = [2, 3, 4]
вызывает 2, 3 и 4, которые должны быть представлены в памяти на определенных адресах. Затем скобки заставляют объект списка быть представленным в памяти, с адресом для класса, int для его длины и массивом адресов для его элементов. Наконец, имя listA
помещается в таблицу пространства имен и привязывается к адресу для этого объекта списка.
listB = listA
Вторая запись listB
выполнена в таблице пространства имен и связан с тем же адресом для списка.
listA = [4, 5, 6]
создает представления трех целых чисел и список в памяти и изменяет адрес, на который ссылается lišta в таблице имен, связывая его с новым списком.
listB[0] = 'new'
вызывает строку «новая», чтобы быть представленной в памяти, а затем изменяет объект списка привязан к listB
таким образом, что первый элемент этого списка теперь ссылается на адрес строки.
Если listA
не был переназначен на новый объект, он будет по-прежнему указывают на тот же список, и вы увидите то же самое изменение в первом элементе списка, является ли с помощью маркера listA
или listB
.
вы переустанавливаете 'listA', поэтому он больше не указывает на то же значение, что и' listB' – njzk2
. Есть хорошие статьи о модели исполнения Python. https://www.jeffknupp.com/blog/2013/02/14/drastically-improve-your-python-understanding-pythons-execution-model/ –