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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:20:41