当前位置: 首页 > 面试题库 >

直观的UnboundLocalError行为的原因

尉迟彬
2023-03-14
问题内容

我偶然发现了这一点:

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

抛出一个UnboundLocalException。现在,我知道为什么会发生这种情况(在此作用域之后,a是受约束的,因此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变体中,此代码应该做什么?a在同print一条语句中,难道在循环的第一个分支与第二个分支(假设存在第二个)中引用完全不同且不相关的变量吗?即使对于单项列表,它的工作方式是否也与非循环代码不同?严重的是,这种疯狂的方式说谎了-
甚至没有想到可怕的实现问题,只是试图记录和教导这一点,这可能会使我切换语言。

语言,其实施者,其老师,其学习者,其从业者承担所有这些概念负担的基本动机是什么, 以支持和鼓励半隐式,非明示使用GLOBAL VARIABLES
?这似乎不是一个值得的目标,是吗?



 类似资料:
  • 根据我的理解,是一个可以随时间变化的值(可以订阅,订阅者可以接收更新的结果)。这似乎与的目的完全相同。 何时使用与?使用比使用有好处吗?或者反之亦然?

  • 我之所以说怪异,是因为我不明白有人可能会告诉我什么在按预期工作。 我有一个带有LiveData成员的Android ViewModel,我在Main活动中观察到它来切换一些代码功能。LiveData对象在视图模型的构造函数中被分配初始值。 从理论上讲,一切都很好,只是在安装后第一次启动应用程序和随后启动应用程序之间,观察者的行为会发生变化。 在安装后的第一次启动期间,在我设置好观察者之后,它们会立

  • 我正在调试使用JPA / Hibernate和Postgres(9.6.2)的Java应用程序的奇怪行为。 应用程序有 3 个实体:用户、国家/地区、用户事件。 Hibernate将其映射到4个表:users、countries、userevent、Hibernate_sequences。 用户实体具有版本列 (@Version) 和用于乐观锁定的主题。@GeneratedValue(strate

  • 问题内容: 我对nextTick和setImmediate之间的区别感到非常困惑。我已经在互联网上阅读了有关它们的所有文档,但我仍然不明白它们是如何工作的。 例子: setImmediate nextTick 为什么会有这些结果?请以视觉或非常容易理解的方式进行说明。甚至节点核心开发人员也不同意人们应该如何理解nextTick和setImmediate。 资料来源: 为什么setImmediate

  • 在这个问题的启发下,我写出了测试题: 本程序以普通大小写形式打印: 首先:我解释这种行为是JIT编译器的存在。“预热”后,每个线程的JIT编译器缓存值非字段。对吧? 第二:如果先对或不对,我如何验证这一点? 附注。-我知道打印-选项。 更新:enviroment:Windows 7 64bit,JDK 1.7.0_40-b43(热点)。

  • 从《狗的名单》中我了解到,《狗的名单》也是一份与直觉完美吻合的动物名单。从定义::[B 我从数组中了解到,狗的数组不是(不能代替a)动物的数组,这是相当违反直觉的。一组狗确实也是一组动物,但显然斯卡拉不同意。 我希望有人能直观地解释为什么数组是不变量的,最好是用狗(或猫)来解释。 这就是为什么数组是不变的,而列表是协变的?但我正在寻找一个更直观的解释,它不(严重)涉及类型系统。 与Scala的不可