python3 a == c,b == d,a == b,但是c不等于d,请帮助我了解原因

问题描述

我创建了一个递归函数,该函数可以反转链表的顺序。例如,如果一个链表最初是[3,2,1],则该函数将返回[1,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)时,它返回false。当我本质上将一个与自己进行比较时,两者为何不相等。您能帮我理解为什么两个变量不相同吗?

谢谢

解决方法

问题确实是可变性。您需要考虑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 node(1)上调用a,但在{{ 1}}和 then b上,它先返回a,然后再返回b


编辑:您将问题更改为仅使用一个变量,这使其更加显而易见:问题在于每个调用都使参数变了。