【问题标题】:warning when python access 2d list with None value当python访问具有无值的二维列表时发出警告
【发布时间】:2018-08-11 14:47:47
【问题描述】:

我想在 python 中创建一个n*n 列表,其中大部分元素都用 None 初始化。然后我将在 for 循环中设置一些元素,但是在我将对角元素设置为 0 的行中,我在 PyCharm 中的 [j] 上得到了一个警告突出显示,说:

"意外的类型:(int, int) 可能的类型:(int, None) (slice, Iterable[None]) 检查信息:此检查检测类型错误 在函数调用表达式中。由于动态调度和鸭子类型, 这在有限但有用的情况下是可能的。种类 函数参数可以在文档字符串或 Python 3 中指定 函数注释。”

我不知道哪里错了。如果我在第一行将 2d 列表全部初始化为 0,那么这个警告就消失了。是什么让None 与众不同?

prev = [[None] * n for i in range(n)]
for i in range(n):
    for j in range(n):
        if i == j:
            prev[i][j] = 0
        ......

【问题讨论】:

  • 在 python 2.7 中就像一个魅力
  • 你的代码在python 3.6.1中对我来说很好
  • 在 Ubuntu 16.04 的 Python 3.5.5Python 2.7.15 中工作正常
  • 我在 Windows 10 x64 中使用 Python 3.6.1 和 PyCharm Community Edition 2018.2
  • 类似的错误有already been reported

标签: python python-3.x pycharm warnings


【解决方案1】:

这只是一个警告,因此您的代码应该仍然可以运行。

PyCharm 试图通过告诉你应该是什么类型的变量来帮助你,帮助你避免错误。但是,有时会出错

此功能在函数中非常有用。例如:

def myfunction(x: str):
    return x

myfunction(1)

您应该在1 上方看到相同的警告,因为它是int,但函数需要str

在您的情况下,类型不明确,因此可能会发生 PyCharm 的误判。

如果您将代码中的None 更改为1 或任何其他int,则表明警告消失了。

prev = [[1] * n for i in range(n)]
for i in range(n):
    for j in range(n):
        if i == j:
            prev[i][j] = 0
                    ^
                    |
              Warning gone

如果您将None 更改为'a' 或任何其他str,您将看到类似的警告,但这次是(int, str)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    相关资源
    最近更新 更多