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)
。
编辑:您将问题更改为仅使用一个变量,这使其更加明显:问题是每次调用都会改变参数。
我创建了一个可以反转链表顺序的递归函数。比如一个链表原本是[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)
。
编辑:您将问题更改为仅使用一个变量,这使其更加明显:问题是每次调用都会改变参数。