[英]How to understand singly linked list in python and their in-place change?
我想要的是:将给定列表(例如a = [3, 7, 5, 8]
3、7、5、8 a = [3, 7, 5, 8]
)转换为单链接列表。
节点定义:
class Node(object):
def __init__(self,val):
self.val = val
self.next = None
a = [3, 7, 5, 8]
CODE-1:
## CODE-1
cur = dummy = Node(a[0])
for e in a[1::]:
cur.next,cur = Node(e),cur.next
代码2:
## CODE-2
cur = dummy = Node(a[0])
for e in a[1::]:
cur.next = Node(e)
cur = cur.next
# the following code outputs result
cur = dummy
while cur is not None:
print(cur.val)
cur = cur.next
问题一:我知道CODE-2输出所需的信息,但我只是想知道CODE-1为什么不起作用? 一定有东西。
问题二:在下次编程时,有什么好的方法可以帮助我更好地理解吗?
最后,导致CODE-1不起作用的原因是:(在CODE-1中)首先,当e=7
, cur
变为None
。 其次,当e=5
, cur.next
执行None.next
,产生错误“ Type”对象没有属性“ next””。 正是CODE-1发生的情况显示为
e = a[1] e = a[2]
operation Node(a[0]) cur.next,cur=Node(e),cur.next then cur.next,cur=Node(e),cur.next
cur 3|pointer None None right-hand-side cur.next raises an error "NoneType has no attribute 'next' " and then exit
cur.next None 7|pointer (No definition)
在分配,Python中检索右侧表达式值的第一 ,然后使用该值,使该分配。
所以
cur.next,cur = Node(e),cur.next
将Node(e)
和cur.next
在堆栈中。 cur.next
在这里是“ None
。 下一步是分配两个值,因此将cur.next
分配给新节点,将cur
分配给None
。
从分配声明文档中 :
赋值语句评估表达式列表(请记住,它可以是单个表达式或逗号分隔的列表,后者产生一个元组),并从左到右将单个结果对象分配给每个目标列表。
将表达式反汇编为字节码时,也可以看到以下内容:
>>> import dis
>>> dis.dis('cur.next,cur = Node(e),cur.next')
1 0 LOAD_NAME 0 (Node)
2 LOAD_NAME 1 (e)
4 CALL_FUNCTION 1
6 LOAD_NAME 2 (cur)
8 LOAD_ATTR 3 (next)
10 ROT_TWO
12 LOAD_NAME 2 (cur)
14 STORE_ATTR 3 (next)
16 STORE_NAME 2 (cur)
18 LOAD_CONST 0 (None)
20 RETURN_VALUE
指令0、2和4执行Node(e)
,将其保留在堆栈上, cur.next
6和8执行cur.next
,将None
保留在堆栈上。 ROT_TWO
然后交换顶部的两个元素,所以Node(e)
现在是在上面,和12和14赋值给cur.next
(从堆栈清除它),然后是16,其存储None
在cur
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.