【问题标题】:Unexpected type warning raised with list in PyCharmPyCharm 中的列表引发了意外的类型警告
【发布时间】:2021-12-22 03:38:04
【问题描述】:

切入正题,下面是会在 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 会给出这个错误,我怎样才能用最干净的代码解决这个问题。谢谢。

编辑:抱歉,示例代码第 3 行的错字已更正。(list2 = [0 for n in range(0)] 应为 list2 = [0 for n in range(5)]

【问题讨论】:

    标签: python python-3.x pycharm


    【解决方案1】:

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

    您可能会说您的列表不是 int 类型的,并且可以通过这种方式接受任何值:

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

    我使用打字模块只是为了解释这个想法。这是宣布 list1 只是任何内容的列表的简单方法:

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

    还要考虑使用尽可能严格的类型。它可以帮助您防止错误。

    如果你需要字符串和整数,那么使用这个:

    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

    【讨论】:

      【解决方案2】:

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

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

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

      这只是警告你,如果你稍后在一些只需要整数并找到一个字符串项目的代码中使用该列表,可能会出错。

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

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

      也可以

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

      或者您可以忽略警告,前提是您要记住该列表可能包含不同的数据类型。

      【讨论】:

      【解决方案3】:

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

      如果您想明确说明您的列表采用任意值,您可以提供适当的类型提示:

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

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

      【讨论】:

        【解决方案4】:

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

        list2 = [0 for n in range(0)]list2 = [] 相同。尝试使用append 将元素添加到列表末尾

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

        【讨论】:

        • 对不起,这是一个错字。我的意思是list2 = [0 for n in range(5)]
        猜你喜欢
        • 2011-09-28
        • 2016-02-17
        • 2020-03-15
        • 2020-05-22
        • 2021-12-07
        • 1970-01-01
        • 2019-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多