为何给Python保留字float、int赋值未报错?后续调用却出错?
为什么给Python保留字float、int赋值时不报错?
嘿,这问题问得挺实在的!其实这是Python设计里一个容易踩坑的“特性”,咱们一步步把它说清楚:
为什么赋值操作本身不报错?
首先得纠正一个小误解:int、float并不是Python的语法保留字(像if、def、class这种才是,你要是把这些当变量名用会直接触发语法错误)。它们只是Python内置命名空间里的内置类型对象(本质是可调用的类),Python允许你在当前作用域中重新给这些名称赋值——把它们从“可调用的类”替换成普通的数值,这一步在语法上是完全合法的,所以不会报错。那为什么调用
int(True)会出问题?
原本的int()是个构造函数,作用是把其他类型转换为整数(比如int(True)会返回1)。但当你执行int = 89之后,当前作用域里的int已经被替换成了整数89——整数是不可调用的对象,你把它当成函数去调用(加括号传参数),自然就会抛出TypeError: 'int' object is not callable的错误了。
顺便提一句:这种覆盖内置名称的操作非常不推荐,会让代码逻辑变得混乱,也很容易引发这类莫名其妙的错误。如果不小心覆盖了,想要恢复原来的内置对象,可以通过import builtins然后执行int = builtins.int来还原。
内容的提问来源于stack exchange,提问作者Bessie Carl
相关产品推荐
相关产品推荐

