我正在使用本地python 2.7解释器来测试一些代码逻辑。 由于关闭解释器的命令是“ exit()”,因此我分配了一个变量,如
exit = False
尝试了一些计算之后,当我想退出我的解释器并给出
exit()
它引发了以下错误,
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'bool' object is not callable
我知道可能已覆盖系统变量,但是这样做很容易吗?即使我这样做,当我尝试将其分配给
exit = True
它不断抛出错误,例如“布尔对象不可调用” 那么,这里出了什么问题?
答案 0 :(得分:2)
我知道可能已覆盖系统变量,但是这样做很容易吗?
您所做的一切都是用一个带有全局名称的内置名称遮盖的。 1 这样做是完全合法的,实际上有时它很有用。例如:
exit
,则不允许sys
定义sys.exit
。 io.open
,codecs.open
和gzip.open
也是如此。还有numpy.min
和pandas.apply
。依此类推。future
并将3.x样式的zip
等放入您的全局变量中。 / li>
更笼统地说,用全局变量遮盖内置的东西与用本地阴影遮盖内置的,全局的或非本地的东西是相同的,因此禁止一个而不禁止另一个则很奇怪。
更笼统地说,Python是围绕“同意成年人”的想法设计的。它不会竭尽全力保护您免受可能用来射击自己的一切事情的侵害。有些事情很少有用,并且通常会引起麻烦(例如重新分配None
),因此值得添加一些代码来防止它们发生,但是在大多数情况下,您可以自由执行即使并非总是一个好主意。
即使我这样做,当我尝试将其分配给
exit = True
它不断向我抛出“无法调用布尔对象”之类的错误,那么,这里出了什么问题?
那不会撤消您所做的事情。这只是意味着内置函数现在被值为True
的全局对象而不是值为False
的全局对象所遮盖。并且True
的可调用性不超过False
。
如果要撤消阴影,只需删除全局阴影:
del exit
1。 Python具有“内建”的几种不同含义,并不能完全重叠。 exit
函数不会编译为内置函数,甚至在builtins
进行猴子修补之前,它甚至都不是site
模块的一部分,但可以通过内置命名空间查找来访问,这就是我在这里所说的意思。