Python:初始化二维数组的不同方法给出不同的输出

Moh*_*asi 3 python loops for-loop

我正在解决一些涉及动态规划的问题。我将 dp 表初始化为 -

n = 3
dp = [[False]*n]*n
print(dp)

#Output - [[False, False, False], [False, False, False], [False, False, False]]
Run Code Online (Sandbox Code Playgroud)

然后我使用 - 将对角线元素设置为 True

for i in range(n):
    dp[i][i] = True

print(dp)

#Output - [[True, True, True], [True, True, True], [True, True, True]]
Run Code Online (Sandbox Code Playgroud)

但是,上面将每个值都设置dp为 True。但是当我将 dp 初始化为 -

dp = [[False]*n for i in range(n)]
Run Code Online (Sandbox Code Playgroud)

然后将对角线元素设置为 True,我得到了正确的输出 - [[True, False, False], [False, True, False], [False, False, True]]

那么星号运算符究竟是如何生成列表的值的呢?

Cih*_*han 5

当你这样做时dp = [[False]*n]*n,你会得到一个包含 n 个相同列表的列表,就像你修改一个一样,所有的都被修改了。这就是为什么使用 的循环n,您似乎修改了所有n^2元素。

你可以这样检查:

[id(x) for x in dp]
> [1566380391432, 1566380391432, 1566380391432, 1566380391432, 1566380391432] # you'll see same values
Run Code Online (Sandbox Code Playgroud)

随着dp = [[False]*n for i in range(n)]您创建不同的列表n时间。让我们再试一次dp

 [id(x) for x in dp]
 [1566381807176, 1566381801160, 1566381795912, 1566381492552, 1566380166600]
Run Code Online (Sandbox Code Playgroud)

一般来说,选择用于*扩展不可变数据类型,并用于for ...扩展可变数据类型(如列表)。

  • 虽然花了我很长时间,但我猜对了哈哈!!很好的答案+1。 (2认同)