You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OOP中IF语句变量逻辑延续性及Python链表实现疑问

链表Push方法的两个疑问解答

先把你的代码贴出来方便对照:

class Node(object):
    def __init__(self, value, nxt):
        self.value = value
        self.next = nxt

class List(object):
    def __init__(self):
        self.begin = None
        self.end = None

    def push(self, obj):
        node = Node(obj, None)
        if self.begin == None:
            self.begin = node
            self.end = self.begin
        else:
            self.end.next = node
            self.end = node

def push():
    list = List()
    list.push("1")
    list.push("2")
    list.push("3")
    list.push("4")

咱们逐个解决你的疑问:

疑问1:IF分支中的逻辑在后续调用push走ELSE分支时是否会持续生效?

不会,IF分支的代码只会在第一次调用push时执行一次——因为第一次调用后self.begin就不再是None了,后续所有push都会走ELSE分支。但你觉得它“持续生效”,是因为Python里的对象引用特性:第一次执行self.end = self.begin时,self.end和self.begin指向的是同一个Node对象(也就是第一个节点)。后续操作self.end的属性(比如self.end.next = node),本质上是在修改这个共享的Node对象,而不是修改self.end或self.begin变量本身。

疑问2:为什么设置self.end = self.begin会导致self.begin被新节点扩展?

这完全是Python的引用传递在起作用,不是self.begin被“修改”,而是它指向的对象的属性被修改了:

  • 第一次push时,创建了Node("1", None),self.begin和self.end都指向这个节点(咱们叫它A)。
  • 第二次push时,走ELSE分支:self.end.next = node其实是给节点A的next属性赋值为新的Node("2", None)(节点B)。因为self.begin指向的就是节点A,所以self.begin.next自然也变成了节点B——这就相当于链表从A延伸到了B。
  • 之后self.end = node把self.end的指向改成了节点B,但self.begin还是指向节点A,而A的next已经是B了,所以整个链表的链就建立起来了。
  • 后续的push都是重复这个逻辑:修改当前self.end指向的节点的next属性,再把self.end移到新节点,而self.begin始终指向第一个节点,它的next链会跟着不断延伸。

简单说:self.begin和self.end一开始是“同指向”,修改它们指向的对象的属性,会同时反映在两个变量的引用上,但之后self.end会移动到新节点,而self.begin留在开头,靠节点的next属性串联起整个链表。

内容的提问来源于stack exchange,提问作者Gamelogic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:20:40