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]]
那么星号运算符究竟是如何生成列表的值的呢?
当你这样做时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 ...扩展可变数据类型(如列表)。