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

如何在Python嵌套函数中使用全局变量?解决回溯场景下num未定义问题

回溯函数变量问题及链表删除报错修复

报错原因

你在嵌套的huisu函数里对num做了赋值操作,Python会默认把num当成这个嵌套函数的局部变量,但你在赋值前先判断了num == 0,这就导致局部变量还没定义就被引用,触发了num未定义的错误。

解决方法

这里提供两种可行的方案,同时修复你原代码里链表操作的逻辑问题:

方案一:用nonlocal声明外部变量

用nonlocal告诉Python,num属于外层函数的变量,不是当前嵌套函数的局部变量:

class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        num = n
        # 加dummy节点,避免删除头节点的边界问题
        dummy = ListNode(0)
        dummy.next = head
        
        def huisu(node):
            nonlocal num
            if not node:
                return
            # 先递归到链表末尾
            huisu(node.next)
            num -= 1
            # 当num减到-1时,当前节点就是目标节点的前一个节点
            if num == -1:
                node.next = node.next.next
        
        huisu(dummy)
        return dummy.next

方案二:用可变对象包装数值

把num放进列表里(列表是可变类型),嵌套函数里修改列表元素不会被判定为局部变量:

class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        # 用列表包装n,避免局部变量问题
        num = [n]
        dummy = ListNode(0)
        dummy.next = head
        
        def huisu(node):
            if not node:
                return
            huisu(node.next)
            num[0] -= 1
            if num[0] == -1:
                node.next = node.next.next
        
        huisu(dummy)
        return dummy.next

原代码的其他问题修正说明

  1. 原代码里对head的赋值操作都是局部变量修改,不会影响原链表结构,所以删除逻辑根本没生效;
  2. 没处理删除头节点的情况,比如当n等于链表总长度时,直接删头节点需要额外判断,加dummy节点可以统一处理所有情况;
  3. 回溯时的计数逻辑调整:递归到链表末尾后开始计数,当计数到-1时,当前节点就是要删除节点的前一个节点,这时候修改next指针才能完成删除。

内容的提问来源于stack exchange,提问作者王洲洋

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:03:30