如何删除 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
以外的名称。事实上,出于这个原因,最好避免将内置函数的名称用于您自己的目的。
今天我遇到了一个关于内置函数 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
以外的名称。事实上,出于这个原因,最好避免将内置函数的名称用于您自己的目的。