gpt4 book ai didi

python - 关于双循环的简单python代码

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:17 25 4
gpt4 key购买 nike

我在 Spyder IDE 上测试了以下 python 代码。认为它会输出二维数组 qq[0][0] 增加到 0..31至 q[3][7] .但它实际上返回 q 为:

[[24, 25, 26, 27, 28, 29, 30, 31], [24, 25, 26, 27, 28, 29, 30, 31], [24, 25, 26, 27, 28, 29, 30, 31], [24, 25, 26, 27, 28, 29, 30, 31]]. 

代码:

q=[[0]*8]*4 
for i in range(4):
for j in range(8):
q[i][j] = 8*i+j
print q

知道这里发生了什么吗?我一步步调试。它显示每一行的更新将与所有其他行同步,这与我对其他编程语言的体验完全不同。

最佳答案

q=[somelist]*4 

创建一个包含四个相同项目的列表,列表 somelist。因此,例如,q[0]q[1] 引用同一个对象。

因此,在嵌套的 for 循环中,q[i] 引用相同的列表,而不管 i 的值如何。

修复:

q = [[0]*8 for _ in range(4)]

列表理解评估 [0]*8 4 次不同的时间,产生 4 个不同的列表。


下面是这个陷阱的快速演示:

In [14]: q=[[0]*8]*4

您可能认为您只更新了第二行中的第一个元素:

In [15]: q[1][0] = 100

但您实际上最终改变了每一行 中的第一个元素:

In [16]: q
Out[16]:
[[100, 0, 0, 0, 0, 0, 0, 0],
[100, 0, 0, 0, 0, 0, 0, 0],
[100, 0, 0, 0, 0, 0, 0, 0],
[100, 0, 0, 0, 0, 0, 0, 0]]

关于python - 关于双循环的简单python代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12236148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com