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

Python中整数与集合的作用域差异及报错原因解析

为什么整数current触发UnboundLocalError而集合不会?

先看你给出的这段代码:

def numIslands(grid):
    def dfs(i,j):
        if i < 0 or j < 0 or i >= len(grid) or j >= len(grid[0]):
            return
        if(i,j) in visited or not grid[i][j]:
            return
        current += 1
        dfs(i+1,j)
        dfs(i-1,j)
        dfs(i,j+1)
        dfs(i,j-1)
        
    res = 0
    for i in range(len(grid)):
        for j in range(len(grid[0])):
            current = 0
            dfs(i,j)
            if current:
                res = max(current, res)
    return res

当你把current定义为整数0,在dfs里执行current +=1时会报UnboundLocalError,但改成集合current = set()后调用current.add((i,j))却正常,核心原因是Python的变量作用域规则+可变/不可变对象的差异:

  • 整数的情况:
    整数是不可变类型,current +=1不是在原整数上修改,而是创建一个新的整数对象(比如从0变成1),然后把current变量指向这个新对象——这相当于在dfs函数内部给current做了赋值操作。Python的规则是:如果函数内部对一个变量做赋值,就会把这个变量视为局部变量。但你在赋值前(current +=1本质是current = current +1,右边的current先被引用),局部的current还没定义,所以就触发了UnboundLocalError。

  • 集合的情况:
    集合是可变类型,current.add((i,j))是直接在原集合对象内部添加元素,没有对current变量本身做赋值(变量还是指向原来的集合对象)。这种情况下,Python不会把current当成dfs的局部变量,而是会向上查找外层函数(numIslands)里定义的current,自然就能正常操作,不会报错。

如果要让整数的情况也正常运行,你需要在dfs函数开头加上nonlocal current声明,告诉Python这个变量不是局部的,而是来自外层嵌套函数的作用域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:20:05