Python函数访问外部t1无需global,修改counta/counto需global的原因
Python变量作用域问题说明
问题现象
- 全局作用域声明的变量
t1,在countApplesAndOranges函数内直接读取时,无需global关键字即可正常运行 - 操作
counta、counto变量时,若不添加global关键字声明,会触发报错:local variable 'counta' referenced before assignment
对应实现代码:
def countApplesAndOranges(s, t, a, b, apples, oranges): counta=0 counto=0 for x in range(len(apples)): app=a+apples[x] if app in range(s,t1): #global counta counta+=1 for y in range(len(oranges)): org=b+oranges[y] if org in range (s,t1): #global count counto+=1 print(counta,counto, sep="\n") if __name__ == '__main__': first_multiple_input = list(map(int,input().rstrip().split())) s = first_multiple_input[0] t = first_multiple_input[1] second_multiple_input = input().rstrip().split() a = int(second_multiple_input[0]) b = int(second_multiple_input[1]) third_multiple_input = input().rstrip().split() m = int(third_multiple_input[0]) n = int(third_multiple_input[1]) apples = list(map(int, input().rstrip().split())) oranges = list(map(int, input().rstrip().split())) from datetime import datetime start_time = datetime.now() t1=t+1 countApplesAndOranges(s, t, a, b, apples, oranges) end_time=datetime.now() duration='Duration:{}' print(duration.format(end_time-start_time))
核心原理
Python的作用域查找遵循LEGB顺序:本地作用域(Local)→ 闭包作用域(Enclosing)→ 全局作用域(Global)→ 内置作用域(Built-in),变量的操作类型决定了是否需要显式声明作用域:
- 仅对变量做读取操作时:Python会按上述顺序逐层查找变量,只要变量在任意外层作用域存在,就能正常读取,不需要额外声明。代码中的
t1定义在全局作用域(if __name__ == '__main__'块不会产生独立作用域,内部定义的变量属于全局作用域),函数内仅读取t1的值作为range的参数,因此不需要global声明就能正常运行。 - 对变量做赋值/修改操作时(包括
=、+=、-=等):只要函数内部出现该变量的赋值语句,Python会默认将这个变量判定为本地作用域变量,不会主动去外层作用域查找。- 如果你要修改的是全局作用域的变量,必须在函数内先用
global 变量名声明,告诉Python该变量来自全局作用域,不要按局部变量处理。 - 如果你要使用的是函数内的局部变量,必须保证在执行读写操作前已经完成初始化。你贴出的代码里
counta、counto已经在函数开头做了=0的初始化,正常运行不需要加global;如果运行时触发「赋值前引用」的报错,说明你实际运行的代码版本不小心删掉了这两行初始化语句,此时执行counta +=1等价于counta = counta +1,Python会把counta识别为局部变量,但等号右侧读取counta时局部变量还没赋值,就会抛出对应错误。
- 如果你要修改的是全局作用域的变量,必须在函数内先用
修正方案
当前贴出的代码逻辑本身没有问题,只要保留函数开头counta=0、counto=0两行局部变量初始化,去掉注释掉的无效global语句即可正常运行,不需要额外加全局声明。如果后续确实需要在函数内修改全局变量,再在函数内对应位置添加global声明即可。
内容的提问来源于stack exchange,提问作者shivalika pillai
相关产品推荐
相关产品推荐

