这里是将在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]
''