腐烂的橘子——LEGB 作用域规则
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
- 值
0代表空单元格; - 值
1代表新鲜橘子; - 值
2代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
示例 1:

输入:grid = [[2,1,1],[1,1,0],[0,1,1]] 输出:4
注意:while并不是一种作用域,所以两个time其实是一个time。
from collections import deque
from typing import Listclass Solution:def orangesRotting(self, grid: List[List[int]]) -> int:rows = len(grid)cols = len(grid[0])que = deque()for i in range(rows):for j in range(cols):if grid[i][j] == 2:que.append((i, j,0))time=0while que:x, y, time = que.popleft()if x<rows-1 and grid[x + 1][y] == 1:grid[x + 1][y] = 2que.append((x + 1, y, time + 1))if x>0 and grid[x - 1][y] == 1:grid[x - 1][y] = 2que.append((x - 1, y, time + 1))if y<cols-1 and grid[x][y + 1] == 1:grid[x][y + 1] = 2que.append((x, y + 1, time + 1))if y>0 and grid[x][y - 1] == 1:grid[x][y - 1] = 2que.append((x, y - 1, time + 1))for i in range(rows):for j in range(cols):if grid[i][j] == 1:return -1return timePython 中变量查找的 LEGB 作用域规则
LEGB 是 Python 中变量查找顺序的缩写。当在 Python 中访问一个变量时,解释器会按照 L → E → G → B 的顺序依次查找变量:
Local(局部作用域)
指函数内部的作用域。
在函数内部定义的变量都属于局部作用域,只能在该函数内部使用。
当函数执行完毕后,局部变量会被销毁。
Enclosing(外部作用域 / 闭包作用域)
指嵌套函数中,外层函数的局部作用域。
当一个函数定义在另一个函数内部时,外层函数的变量对内层函数可见,这些变量就属于外部作用域。
若要在内层函数中修改外层函数的变量,必须使用关键字
nonlocal。
Global(全局作用域)
指当前模块(.py 文件)最外层定义的作用域。
在全局定义的变量可以被模块中的所有函数访问。
若要在函数内部修改全局变量,必须使用关键字
global。
Built-in(内置作用域)
指 Python 解释器内置的命名空间。
包含了系统内置的函数和异常,如
print()、len()、id()、range()等。这些名称在任何作用域下都可以直接使用。
关键字说明
global:
在函数内部声明变量为全局变量,允许在函数中修改模块级变量。
示例:x = 10 def func():global xx = 20nonlocal:
在嵌套函数中使用,用于声明变量属于外层函数的作用域(但不是全局作用域),允许在内层函数中修改外层函数的变量。
示例:def outer():a = 1def inner():nonlocal aa += 1
总结
Python 查找变量时遵循 LEGB 顺序:
Local → Enclosing → Global → Built-in只有函数、类、模块会创建新的作用域;
if、for、while不会。若要在函数中修改外层或全局变量,需显式使用
nonlocal或global。
