python3 a==c, b==d, a==b, 但是c不等于d,请帮我理解为什么

python3 a==c, b==d, a==b, but c is not equal to d, please help me to understand why

我创建了一个可以反转链表顺序的递归函数。比如一个链表原本是[3,2,1],那么函数就会return [1,2,3].

代码如下:

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

def recursive(l3):
    if l3.next is None:
        return l3
    else:
        a=l3           
        head=recursive(l3.next)
        b=head       
        while b.next is not None:
            b=b.next
        b.next=a
        b.next.next=None
        return head

现在我有一个链表 a :

a=node(1,node(2))

然而,当我尝试 recursive(a)==recursive(a) 时,它 return 是错误的。当我本质上是将一个与自身进行比较时,为什么两者不相等。你能帮我理解为什么这两个不是同一个变量吗?

谢谢

问题确实是可变性。您需要考虑 recursive 对链表的作用。除了返回“反向链表”之外,它还会改变原始链表。它发生在例如这里:

a=l3           
...
b.next=a
b.next.next=None

实际上,这与 l3.next = None 相同。

不过,最重要的是,您构建的两个链表共享同一个节点 c,并且它也通过调用 recursive 发生变异(它的 next 被重新分配)。

确实,在调用 recursive(a) 之后,您可以看到 c.next 指向 node(2) 而不是 None。调用 recursive(b)c.next 指向 node(4)

因此,recursive returns node(1) 如果您在 a b 上调用它,但是如果你在 a 上调用它,然后在 b 上调用 然后 ,它会 returns node(1) 然后 node(2)


编辑:您将问题更改为仅使用一个变量,这使其更加明显:问题是每次调用都会改变参数。