python 访问具有 None 值的二维列表时发出警告

warning when python access 2d list with None value

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

"Unexpected type(s): (int, int) Possible types: (int, None) (slice, Iterable[None]) Inspection info: This inspection detects type errors in function call expressions. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Types of function parameters can be specified in docstrings or in Python 3 function annotations."

不知道哪里错了。如果我将 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
        ......

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

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)