为什么像\`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

为什么会发生这种情况,我该如何解决?


如果您在交互式会话中遇到了这样的问题,并且您想在不重新启动解释器的情况下解决问题,请参阅 如何恢复我意外覆盖的内置函数? .

原文由 P‘sao 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 519
2 个回答

代码说:

 global str
str = str(parameter)

您正在重新定义 str() 的含义。 str 是字符串类型的内置Python名称,你不想改变它。

为局部变量使用不同的名称,并删除 global 语句。

请注意,如果您在 Python REPL 中使用了这样的代码,那么对全局 str 的分配将持续存在,直到您对其进行处理。您可以重新启动解释器,或 del str 。后者之所以有效,是因为 str 实际上 不是 默认定义的全局变量 - 相反,它通常在后备中找到( builtins 标准库模块,它在启动时专门导入并给出全局名称 __builtins__ )。

原文由 Greg Hewgill 发布,翻译遵循 CC BY-SA 4.0 许可协议

虽然不在您的代码中,但另一个难以发现的错误是在尝试格式化字符串时缺少 % 字符:

 "foo %s bar %s coffee"("blah","asdf")

但它应该是:

 "foo %s bar %s coffee"%("blah","asdf")

缺少的 % 将导致相同的 TypeError: 'str' object is not callable

原文由 n611x007 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题