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

