V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JasonLaw
V2EX  ›  程序员

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

  •  
  •   JasonLaw · 2022-07-17 20:28:31 +08:00 · 1705 次点击
    这是一个创建于 620 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2022-07-17 21:50:53 +08:00

    我应该先自己搜索的,已经习惯了创建主题🤐,python - Local (?) variable referenced before assignment - Stack Overflow给出了答案,不过我不知道为什么加上global之后会出现了NameError: name 'diameter' is not defined。

    第 2 条附言  ·  2022-07-17 22:20:19 +08:00

    使用nonlocal解决了问题,可以点击closures - Python nonlocal statement - Stack Overflow了解更多。

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

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

    谢谢,可以了。
    dyrex
        9
    dyrex  
       2022-07-17 23:56:42 +08:00 via Android
    python 是动态类型,赋值即定义,函数内 diameter=相当于重新定义了一个变量,但是这个变量还没有赋值完成你就使用了,所以就报错了,可以使用 global 提升为全局变量,也可以使用 nonlocal 形成闭包来解决
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1635 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:50 · PVG 00:50 · LAX 09:50 · JFK 12:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.