如何删除 python builtins?调用某个函数时 min() 消失

How can python builtins be deleted? min() disappears when a certain function is called

今天我遇到了一个关于内置函数 min() 的奇怪错误。 我注意到它在我的程序执行期间被重写了,所以当 min() 被重写 (print(min.__module__)) 时,我开始在堆栈的每个函数中寻找,我得到了 UnboundLocalError: 局部变量 'min' 在赋值前被引用 我仍在调试并在提交之间来回检查是什么导致了问题。程序依赖不同的模块,但是模块和上次程序成功的一样

我想知道,如何删除内置的"min"?我确信我没有用那个名字声明任何变量,即使我声明了,错误也会不同。 del min 应该恢复内置(但在我的情况下,我得到了上面的错误) builtins['min'] 有效(在我尝试过的 3 个系统中的 2 个中)

知道这怎么可能吗?

您可以删除它,但您必须明确地执行此操作:

>>> min(5,5)
5
>>> del __builtins__.min
>>> min(5,5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'min' is not defined

只是从函数中删除它并不会从 __builtins__ 中删除它,所以你的被调用者一定是故意的

一般来说,local variable referenced before assignment的原因不是有人删除了min,而是你在函数的某处赋值给了一个名为min的变量after 您收到该错误的时间点。 (分配也可能在 if 分支中未被采用, 错误之前,但根据我的经验,我提出的第一种情况更有可能。)

因为你已经在函数的某个地方赋值给它并且没有声明它是全局的,所以它是该函数内部的一个局部变量,并且它的所有使用都是指那个局部变量,而不是内置函数.但是,您尚未为其分配值,因此 Python 不知道您希望它具有什么值。

示例:

def test():
     x = min(1, 2, 3)                   # error message here
     y = max(1, 2, 3)
     # ... lots of code might go here
     min = x if x < y else y            # local assignment here

test()

解决方法很简单。不要那样做。为您自己的变量使用 min 以外的名称。事实上,出于这个原因,最好避免将内置函数的名称用于您自己的目的。