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

Python中nonlocal关键字的使用时机解析——基于LeetCode 210题实践

关于Python nonlocal关键字的使用时机

先看你的代码为什么不用nonlocal visited也能正常运行:
你在findOrder方法里定义的visited是一个可变的set对象,在嵌套的dfs函数中,你执行的visited.add(curr)只是修改了这个set对象的内部内容,并没有改变visited变量本身的引用(它依然指向最初创建的那个set)。Python允许嵌套函数直接访问外层作用域的可变对象并修改其内部状态,这种场景下不需要额外声明nonlocal。

那什么时候必须使用nonlocal?
只有当你需要在嵌套函数里重新赋值外层函数作用域的变量(也就是让变量指向一个全新的对象)时,才需要用nonlocal声明。举两个典型场景:

  • 如果你在dfs里写visited = set(),这是给visited重新赋值一个新的set对象。没有nonlocal声明的话,Python会把visited当成dfs的局部变量,而你在赋值前又有if curr in visited的引用操作,就会抛出UnboundLocalError。
  • 再比如,如果你用整数count = 0统计访问过的课程数,在dfs里写count += 1——这本质是count = count + 1,属于重新赋值操作,这时候必须加nonlocal count,否则同样会触发错误。

总结核心规则:

  • 仅访问外层作用域的变量:无需任何声明(不管变量指向的是可变还是不可变对象)
  • 修改外层作用域可变对象的内部状态:无需nonlocal
  • 重新赋值外层作用域的变量(无论对象可变与否):必须用nonlocal声明

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 20:27:41