Python内部函数修改外部局部变量:列表与整数的差异原因
为什么DFS里用列表
time=[0]正常,用整数time=0会报错? 这本质是Python的变量作用域和可变/不可变类型的区别导致的:
先看整数的情况:当你在递归函数里写
time += 1时,Python会把这个操作理解为「给局部变量time赋值」——哪怕外部已经有个同名的全局time,函数内部只要出现赋值操作,Python就默认这个time是局部变量。但你在赋值前肯定已经引用过time(比如记录发现时间的时候要用当前time值),这就出现了「局部变量time在赋值前被引用」的错误。再看列表的情况:
time[0] += 1不是给变量time本身赋值,而是修改列表对象内部的元素。变量time始终指向外部定义的那个列表,Python不会把它当成局部变量,所以直接用外部的列表,自然不会报错。
举个极简对比例子:
# 整数版(报错) time = 0 def dfs(): print(time) # 这里引用局部变量,但还没赋值,触发报错 time += 1 # 列表版(正常运行) time = [0] def dfs(): print(time[0]) # 直接读取外部列表的元素 time[0] += 1 # 修改列表内部元素,不改变time变量本身的指向
如果非要用整数,也可以在函数里加global time声明(如果time是全局变量),或者用nonlocal(如果time是嵌套函数里的外层变量),明确告诉Python这个time不是局部变量,而是外部的变量。
内容的提问来源于stack exchange,提问作者caleb
相关产品推荐
相关产品推荐

