Если экземпляры класса всегда передаются по ссылке? - PullRequest
0 голосов
/ 20 сентября 2019

Я реализую отдельный LinkedList в Python3.Программа назначает «current_node» для «previous_node», а затем меняет «current_node» на «current_node.next».Я ожидаю, что это изменение будет применено и к «предыдущему узлу», но это не так.

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

a = [7, 8, 11, 3]

fst_node, sec_node, thd_node, frt_node = ListNode(a[0]), ListNode(a[1]), ListNode(a[2]), ListNode(a[3])

fst_node.next = sec_node
sec_node.next = thd_node
thd_node.next = frt_node

current_node  = sec_node
previous_node = current_node
print(previous_node, current_node)
current_node  = current_node.next
print(previous_node, current_node)

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Ссылка (переменная) и сам объект не одно и то же.

Вы можете изменить переменную так, чтобы она указывала на другой объект, но не объект будет изменен.

objRef = someObject
anotherObjRef = objRef
objRef = anotherObject
# anotherObjRef will still point to someObject!

Но если вы измените что-то в объекте (через ссылку), объект будет изменен, поэтому вы увидите новое значение во всех ссылках:

objRef = someObject
anotherObjRef = objRef
objRef.someData = something
# anotherObjRef.someData is something!
0 голосов
/ 20 сентября 2019
current_node  = sec_node
previous_node = current_node  # current_node points to the same object as previous_node
print(previous_node, current_node)
current_node  = current_node.next  # changes where current_node points to
print(previous_node, current_node)

Вы заметили, что previous_node не переназначается здесь?Только current_node есть.Это все еще переход по ссылке, вы просто меняете то, что current_node ссылается, и оставляете precious_node в покое.

...