为什么代码 `str = str(...)` 只在第二次导致 TypeError?
我有一些代码如下:
def example(parameter):
global str
str = str(parameter)
print(str)
example(1)
example(2)
第一次调用example
时是正常的,但第二次调用时却出现了这样的错误:
Traceback (most recent call last):
File "test.py", line 7, in <module>
example(2)
File "test.py", line 3, in example
str = str(parameter)
TypeError: 'str' object is not callable
为什么会这样呢?我该怎么解决这个问题呢?
如果你在一个交互式会话中遇到类似的问题,并且想在不重启解释器的情况下解决它,可以查看这个链接:如何恢复我意外覆盖的内置函数?。
20 个回答
26
在我的情况中,我有一个类,这个类里面有一个方法和一个字符串属性,它们的名字是一样的。我想调用这个方法,但却得到了那个字符串属性。
121
在你的代码中,还有一个不容易发现的错误,就是在字符串格式化时,缺少了%
这个符号:
"foo %s bar %s coffee"("blah","asdf")
但其实应该是:
"foo %s bar %s coffee"%("blah","asdf")
如果缺少了%
,就会导致同样的错误:TypeError: 'str' object is not callable
。
162
在代码中提到:
global str
str = str(parameter)
你正在重新定义 str()
的含义。str
是Python中字符串类型的内置名称,你不想去改变它。
应该给本地变量起个不同的名字,并且去掉 global
这个声明。
注意,如果你在Python的交互式环境中使用了这样的代码,那么对全局的 str
的赋值会一直存在,直到你采取一些措施来处理它。你可以重启解释器,或者使用 del str
来删除它。后者之所以有效,是因为 str
默认并不是一个真正定义的全局变量 - 它通常是在一个备用位置找到的(也就是 builtins
这个标准库模块,它在启动时被特别导入,并被赋予全局名称 __builtins__
)。