Python 中的对象分配意外行为

Object assignment unexpected behavior in Python

提问人:mgus 提问时间:1/30/2020 最后编辑:mgus 更新时间:1/30/2020 访问量:43

问:

请考虑以下单向链表的简单构造。假设我想保留头部的备份,并在对列表执行某些操作后返回头部。我以为在更换头部之前需要做一个或获得头部的复制品(另见 这里这里).但是,这里似乎并非如此,我可以通过简单的作业来做到这一点。我无法解释这种行为以及它为什么有效。你能提供任何来源来帮助我理解它吗?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)
python 对象 分配 赋值运算符

评论

0赞 Mark 1/30/2020
您所要做的就是获取所指的名称,并将该名称指向此不会影响对象或根本不影响对象。headn1n2n1n2
0赞 mgus 1/30/2020
@MarkMeyer我还是不明白。即使我在 main 函数中执行相同的代码并使用 instead of 和 instead of ,我也可以复制此行为,请参阅编辑。n1headn1backupheadCpy
0赞 chepner 1/30/2020
headCpy = head不创建节点的副本;它只是对同一节点进行另一个引用。阅读 nedbatchelder.com/text/names.html,了解有关 Python 名称如何工作的更多讨论。写入后,仍然引用用于引用的节点。head = head.nextheadCpyhead

答: 暂无答案