Обновление значения None не отражается в объекте - PullRequest
2 голосов
/ 21 апреля 2019

У меня есть связанный список со следующей структурой.

class Node:
  def __init__(self,val):
    self.val = val
    self.next = None

n1 = Node(1)
n2 = Node(2)
n3 = Node(3)
n4 = Node(4)

n1.next = n2
n2.next = n3
n3.next = n4

Последним последним узлом является None, но при обновлении он отражается в связанном списке.

a = n4.next 
a = Node(5)
print(n4.next)
>> None

Но когда я обновляю напрямую (без переменной temp), это работает

n4.next = Node(5)
print(n4.next)
>> <<Node Object>>

Почему это происходит? Я думал, что None также является объектом в Python, а присвоения объектов просто копируют ссылки.

1 Ответ

3 голосов
/ 21 апреля 2019

Я думаю, вы путаете специальный одноэлементный объект Python None с обычным экземпляром класса Python.

И вы путаете термин «переменная» классического языка программирования (контейнер для значений) со ссылками (переменные, которые ссылаются или указывают на контейнеры значений)

В Python все имена переменных являются ссылками на объекты.

Скажем, вы делаете что-то вроде

a = n1
a.val = 10

Это будет отражено в n1 объекте (экземпляре класса Node), поскольку a является ссылкой на n1.

Попытка сделать что-то вроде

n4.next = None 
a = n4.next
a = Node(3) 

заставит a сначала обратиться к None, а затем изменит a для ссылки на другой объект, новый экземпляр Node.

Если a относится к экземпляру Node, вы можете изменить экземпляр с помощью a

n4.next = Node(2) 
a = n4.next
a.val = 5 #this would alter n4.next

Но если a относится к специальному объекту None, None не будет действовать как экземпляр узла и, следовательно, не может быть изменен

...