Python中的对象分配意外行为

Python中的对象分配意外行为,python,object,assign,assignment-operator,Python,Object,Assign,Assignment Operator,考虑以下单链表的简单构造。假设我想保留头部的备份,并在对列表执行某些操作后返回头部。我想我需要做一个copy()或deepcopy()来获得头部的副本,然后再进行更改(另请参见和)。然而,这里的情况似乎不是这样,我可以通过一个简单的赋值=来完成。我无法解释这种行为以及它为什么起作用。你能提供一些资料来帮助我理解它吗 class ListNode: def __init__(self, x): self.val = x self.next = None c

考虑以下单链表的简单构造。假设我想保留头部的备份,并在对列表执行某些操作后返回头部。我想我需要做一个
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)

你所做的只是取下
head
这个名字,它指的是
n1
,然后把这个名字指向
n2
,这根本不会影响对象
n1
n2
。@MarkMeyer我还是不明白。即使我在主函数中执行相同的代码,并且使用
n1
而不是
head
n1backup
而不是
headCpy
,我也可以复制此行为,请参见编辑。
headCpy=head
不复制节点;它只是对同一个节点进行另一个引用。有关Python名称如何工作的更多讨论,请阅读。写入
head=head.next
后,
headCpy
仍然引用
head
用来引用的节点。