Я объявил два ListNode
объекта как head = curr = ListNode(0)
.Теперь, к моему удивлению, они оба указывают на один и тот же адрес:
>>> head
<__main__.ListNode object at 0x10bf271d0>
>>> curr
<__main__.ListNode object at 0x10bf271d0>
Почему это так?Почему это не похоже на a = b = 4
?
Потому что, если я внесу изменения в b
, на a
это не повлияет.Однако, если я внесу изменения в curr
следующим образом, head
сможет отследить это:
>>> curr.next = ListNode(1)
>>> curr = curr.next
>>> head
<__main__.ListNode object at 0x10bf271d0>
>>> curr
<__main__.ListNode object at 0x10bf27190>
>>> head.next
<__main__.ListNode object at 0x10bf27190>
Я понимаю, что head
и curr
объявляются со ссылкой науказатели (адрес) и a
и b
создаются путем ссылки на значение.Это правильно?
Если да, как я могу контролировать то, что объявляется с помощью ref для значения, а что объявляется с помощью ref для указателей (адреса)?
Класс ListNode
, использованный выше:следующим образом:
>>> class ListNode(object):
... def __init__(self, x):
... self.val = x
... self.next = None
...
РЕДАКТИРОВАТЬ: Объяснение того, чем этот вопрос отличается от изменяемой v / s неизменяемой неизменной и изменяемой типов .
Этот вопрос касается связывания иссылка на переменные, тогда как другой вопрос строго говорит о том, что Mutable и Immutable объекты в Python и их различия.Хотя последний действительно говорит о ссылках на переменные для объяснения Mutable v / s Immutable, он не учитывает сомнение, которое задается в этом вопросе, и, следовательно, для сообщества эти запутанные наблюдатели будут знать концепцию ссылок из-за этоговопрос.