PyCharm中的列表引发了意外的类型警告



这里是将在PyCharm:中引发错误的示例代码

list1 = [0] * 5
list1[0] = ''
list2 = [0 for n in range(5)]
list2[0] = ''

PyCharm然后在第2行和第4行返回一个错误,如下所示:

Unexpected type(s):(int, str)Possible type(s):(SupportsIndex, int)(slice, Iterable[int])

运行代码不会导致任何错误,但PyCharm在我编码时不断发出上述消息。

为什么PyCharm会出现这个错误,我如何用最干净的代码来解决这个问题?

在您的例子中,PyCharm看到您的第一行,并认为列表的类型是List[int]。我的意思是它是一个整数列表。

您可能会发现您的列表不是int类型的,可以通过以下方式接受任何值:

from typing import Any, List
list1: List[Any] = [0] * 5
list1[0] = ''

我使用打字模块只是为了解释这个想法。这里有一个简单的方法来宣布list1只是任何东西的列表:

list1: list = [0] * 5
list1[0] = ''

还要考虑使用尽可能严格的打字。它可以帮助你防止错误。

如果您同时需要字符串和int,请使用以下命令:

from typing import List, Union
list1: List[Union[int, str]] = [0] * 5
# Starting from Python 3.10 you may use List[int|str] instead 

此处的文档:https://docs.python.org/3/library/typing.html

这只是来自代码检查工具的警告。

这基本上是说,您创建了一个整数列表(包含五个等于0的项(,然后用字符串替换一个整数。

这不会在python中生成错误,因为它对数据类型非常灵活,如果您愿意,可以生成具有不同数据类型的列表。

这只是警告您,如果您稍后在某些代码中使用该列表,而该代码只需要整数,而找到的却是字符串项,则可能会出现问题。

可以通过禁用检查或直接创建字符串列表来解决此问题。

list1 = [""] * 5
list2 = ["" for n in range(0)]

或者

list1 = ["0"] * 5
list2 = ["0" for n in range(0)]

或者,只要记住列表可能包含不同的数据类型,就可以忽略警告。

正如其他人所说,这只是一个警告,告诉你要小心。

如果你想明确你的列表采用任意值,你可以提供一个合适的类型提示:

from typing import Any, List
list1: List[Any] = [0] * 5
list1[0] = ''

如果你想放整数或字符串,但列表中没有其他内容,你也可以从Python 3.10开始做list1: List[int|str] = [0] * 5,或者在旧版本上使用笨重的typing.Union

除非您已经用n+1元素初始化了列表,否则您不能分配给像list2这样的列表。

CCD_ 7与CCD_。尝试使用append将元素添加到列表的末尾

>>> list2.append('')
>>> list2[0]
''

最新更新