为什么代码 `str = str(...)` 只在第二次导致 TypeError?

103 投票
20 回答
908208 浏览
提问于 2025-04-16 17:51

我有一些代码如下:

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__)。

撰写回答