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
相关产品推荐
相关产品推荐

