Python - 这段代码为什么会出现 UnboundLocalError: local variable 'diameter' referenced before assignment?

2022-07-17 20:28:31 +08:00
 JasonLaw

对 Python 也不是特别了解,下面的代码为什么会出现错误呢?

1740 次点击
所在节点    程序员
9 条回复
learningman
2022-07-17 20:30:15 +08:00
用之前 global 一下
L1B
2022-07-17 20:38:31 +08:00
因为 python 在处理 dfs 函数的时候发现你给 diameter 赋值了于是认为它是一个 local variable ,这种情况用 1 楼说的方法,在 dfs 函数里面 global 申明一下即可。
filwaline
2022-07-17 21:34:35 +08:00
DOLLOR
2022-07-17 21:48:27 +08:00
由于 python 没有类似其他语言的 var 、let 声明关键字,所以嵌套的作用域内部,每个首次出现的 xxx = yyy 都视为声明新的变量。如果想沿用外部的变量,就要在该作用域下用 nonlocal 或者 global 再声明一次变量。
JasonLaw
2022-07-17 21:53:15 +08:00
@learningman #1
@L1B #2
@filwaline #3
@DOLLOR #4

我加上了 global ,不过出现了 NameError: name 'diameter' is not defined ,详情可见附言,是哪里做错了吗?
DOLLOR
2022-07-17 21:59:53 +08:00
用 nonlocal
@JasonLaw
L1B
2022-07-17 22:13:28 +08:00
抱歉,我上面说错了,应该用 nonlocal 拿外层作用域(从内往外找最近的)的,global 是拿全局的,你这个 diameter 不是全局的。
JasonLaw
2022-07-17 22:20:48 +08:00
@DOLLOR #6
@L1B #7

谢谢,可以了。
dyrex
2022-07-17 23:56:42 +08:00
python 是动态类型,赋值即定义,函数内 diameter=相当于重新定义了一个变量,但是这个变量还没有赋值完成你就使用了,所以就报错了,可以使用 global 提升为全局变量,也可以使用 nonlocal 形成闭包来解决

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/866838

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX