В большинстве случаев в Python, когда вы выполняете присваивание переменной, P
в этом случае значение P
изменяется, но объект, на который он первоначально ссылался, не,Это потому, что переменные Python - это просто ссылки / указатели на объекты. Вот пример:
var1 = "test1"
var2 = "test2"
var3 = var1 # var3 = "test1"
var1 = var2 # var1 = "test2"
print(var1) # "test2"
print(var2) # "test2"
print(var3) # "test1"
Так что же здесь происходит? Ну, мы просто меняем то, на что указывают эти переменные, мы не меняем базовый объект.
Теперь в вашем случае вы делаете следующее:
# changing value of pointer does not affect L
P = L
P = P.next
L.iterateLL() # L is unchanged
Когда вы делаете P = L
и P = P.next
, вы просто меняете то, на что указывает переменная P
. Вы не вносите изменения в базовый объект, на который указывает P
. Давайте представим это.
Оригинальная конфигурация:
P = L
P = L.next
Однако, когда вы делаете
P = L
P.next = P.next.next
L.iterateLL() # we've now skipped node two
Вы изменяете атрибут объекта, на который указывает P
. Вы устанавливаете атрибут P.next
, чтобы он указывал на P.next.next
. Вы на самом деле не вносите изменения в базовый объект, на который изначально указывал P.next
. При этом объект, на который P.next
первоначально указывал, выходит из области видимости и очищается сборщиком мусора.
P.next = P.next.next
Судя по вашему коду, я предполагаю, что в этом случае вы намеревались удалить L
из LinkedList и в итоге получить список, подобный "2 3 4". Для этого достаточно сделать L = L.next
. Это заставит первый узел выйти из области видимости, и сборщик мусора должен очистить его.
В качестве краткого замечания я упомянул, что в большинстве случаев присваивание не вносит изменений в объект, на который указывает переменная. Однако свойства немного отличаются. Они переопределяют магический метод __set__
, который позволяет редактировать базовый объект с помощью оператора присваивания. Здесь дело не в этом.