链表代码疑问:类实例作为函数参数传递及None比较逻辑解析
Python链表代码示例
class Node: def __init__(self, data): self.data = data self.next = None def printLL(head): while head is not None: print(head.data,end=" ") head = head.next node1 = Node(10) node2 = Node(20) node3 = Node(30) node4 = Node(40) node1.next = node2 node2.next = node3 node3.next = node4 printLL(node2)
技术疑问
- 调用
printLL(node2)时,head被赋值为node2这个类实例,该过程具体是如何工作的? - 在
while head is not None:语句中,我们究竟是在将什么与None进行比较?
问题解答
1. 函数参数传递的具体过程
Python采用对象引用传递的方式处理函数参数。当调用printLL(node2)时,node2是已经创建好的Node类实例,它在内存中占有一块存储空间。此时会把node2指向该内存对象的引用,传递给函数printLL的形参head。
简单来说,head和node2这两个变量此时指向内存中同一个Node实例(即存储数据20的节点)。需要注意的是,函数内部的head是局部变量,后续修改head的指向(比如执行head = head.next)只会改变head自身的指向,不会影响外部的node2变量。
2. while循环的比较逻辑
这里比较的是当前head变量所指向的对象引用是否为None。
在链表结构中,每个Node实例的next属性默认被初始化为None,用来标记链表的末尾。遍历过程中,每次循环会把head更新为当前节点的next(即下一个节点的引用)。当遍历到最后一个有效节点(比如示例中的node4)时,它的next属性是None,下一次循环head就会被赋值为None,此时head is not None的条件不成立,循环终止。
本质上是判断当前是否还有有效的链表节点可以访问,避免因访问不存在的节点而引发错误。
内容的提问来源于stack exchange,提问作者yt 4months
相关产品推荐
相关产品推荐

