python-3.x - python3 a==c,b==d,a==b,但是c不等于d,请帮我理解为什么
问题描述
我创建了一个可以反转链表顺序的递归函数。例如,如果一个链表最初是 [3,2,1],则该函数将返回 [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)
它返回错误。当我本质上将一个与自身进行比较时,为什么两者不相等。你能帮我理解为什么这两者不是同一个变量吗?
谢谢
解决方案
问题确实是可变性。您需要考虑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)
改为。
出于这个原因,如果您调用它 on or ,则recursive
返回,但如果您调用它 on然后on ,它会返回and then 。node(1)
a
b
a
b
node(1)
node(2)
编辑:您将问题更改为仅使用一个变量,这使其更加明显:问题是每次调用都会改变参数。
推荐阅读
- html - 绝对容器中的 CSS flex 布局
- docker - 错误:错误:请求超时-InfluxDB sitespeed.io
- sql-server - 插入 OPENROWSET 错误字符串或二进制数据将被截断
- python - 如何使用 setuptools 在 Python 的不同文件夹中组织我的测试
- iot - 设备未向 LWM2M 代理发送数据
- html - HTML 锚标记未重定向
- magento2 - Magento2 主页 cms:我的主页 cms 中的内容来自哪里
- javascript - 在对象js中存储的1个位置显示一系列图像
- shell - 从 json 响应中删除 shell 中的特殊字符
- javascript - Select value in select by text when select have a value?