gpt4 book ai didi

python - 不直观的 UnboundLocalError 行为的原因

转载 作者:太空狗 更新时间:2023-10-30 02:35:41 26 4
gpt4 key购买 nike

注意:有一个非常相似的问题here .但是,请耐心等待;我的问题不是“为什么会发生错误”,而是“为什么 Python 被实现为在这种情况下抛出错误。”

我只是偶然发现了这个:

a = 5
def x()
print a
a = 6
x()

抛出一个 UnboundLocalException。现在,我知道为什么会发生这种情况(在这个范围的后面,a 被绑定(bind),所以 a 在整个范围内被认为是本地的)。

在这种情况下:

a = 5
def x()
print b
b = 6
x()

这很有道理。但是第一种情况有一个直观的逻辑,这意味着:

a = 5
def x()
print globals()["a"]
a = 6 # local assignment
x()

我想“直观”版本不被允许是有原因的,但它是什么?虽然这可能是“显式优于隐式”的情况,但摆弄 globals() 对我来说总是感觉有点不干净。

从正确的角度来看,这件事发生在我身上的实际情况是我不得不暂时更改别人的脚本。在我的(短暂的)更改中,我在脚本运行时做了一些文件重命名,所以我插入了

import os
os.rename("foo", "bar")

进入脚本。这种插入发生在函数内部。该模块已经在顶层导入了 os(我没有检查),并且一些 os.somefunction 调用是在函数内部进行的,但在我插入之前。这些调用显然触发了 UnboundLocalException

那么,有人可以向我解释一下这个实现背后的原因吗?是为了防止用户犯错吗? “直观”的方式只会让字节码编译器变得更复杂吗?或者是否存在我没​​有想到的可能的歧义?

最佳答案

在同一个线性代码流中使用相同的、相同的名称指代完全不同的变量是一种令人难以置信的复杂性,令人难以置信。考虑:

def aaaargh(alist):
for x in alist:
print a
a = 23

这段代码在您想要的 Python 变体中应该做什么?完全相同的 print 语句中的 a 是否在循环的第一段与第二段(假设有第二段)引用完全不同且不相关的变量?即使对于单项列表,它的工作方式是否与非循环代码不同?说真的,这种疯狂的谎言——甚至不考虑可怕的实现问题,只是试图记录和教授这可能会让我切换语言。

对于语言、它的实现者、它的教师、它的学习者、它的实践者来说,承担所有这些概念负担的基本动机是什么——支持和鼓励半隐藏的、非显式的使用全局变量?!这似乎不是一个值得的目标,现在是吗?!

关于python - 不直观的 UnboundLocalError 行为的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1188944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com