Неожиданное поведение при назначении объекта в Python - PullRequest
0 голосов
/ 30 января 2020

Рассмотрим следующую простую конструкцию односвязного списка. Предположим, что я хочу сохранить резервную копию головы и после внесения изменений в список вернуться обратно к голове. Я подумал, что мне нужно будет сделать copy() или deepcopy(), чтобы получить точную копию головы, прежде чем менять ее (см. Также здесь и здесь ). Однако, похоже, что это не так, и я могу сделать это простым заданием =. Я не могу объяснить это поведение и почему оно работает. Можете ли вы предоставить какие-либо источники, которые помогут мне понять это?

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

class Class:
    def foo(self, head: ListNode):

        headCpy = head

        print(id(head))
        print(head.val)
        print(id(headCpy))
        print(headCpy.val)

        head = head.next

        print(id(head))
        print(head.val)
        print(id(headCpy))
        print(headCpy.val)



if __name__ == '__main__':

    n1 = ListNode(1)
    n2 = ListNode(2)
    n3 = ListNode(3)
    n1.next = n2
    n2.next = n3

    Class().foo(n1)

Следующее имеет ту же проблему

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

n1 = ListNode(1)
n2 = ListNode(2)
n3 = ListNode(3)
n1.next = n2
n2.next = n3

n1backup = n1
n1 = n1.next
print(n1backup.val)
print(n1.val)
...