繁体   English   中英

如何理解python中的单链列表及其就地更改?

[英]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=7cur变为None 其次,当e=5cur.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,其存储Nonecur

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM