嵌套列表索引

在代码中使用Python中的嵌套列表时,我遇到了一些问题。

基本上,我有一个包含所有0值的2D列表,我想在一个循环中更新列表值。

然而,Python并没有产生我想要的结果。有什么我误解的吗range()Python列表索引呢?

some_list = 4 * [(4 * [0])]for i in range(3):
    for j in range(3):
        some_list[i+1][j+1] = 1for i in range(4):
    print(some_list[i])

我预期的结果是:

[0, 0, 0, 0][0, 1, 1, 1][0, 1, 1, 1][0, 1, 1, 1]

但是Python的实际结果是:

[0, 1, 1, 1][0, 1, 1, 1][0, 1, 1, 1][0, 1, 1, 1]

这里发生了什么事?

嵌套列表索引

翻翻过去那场雪
浏览 737回答 2
2回答

慕婉清6462132

实际上,列表中的所有对象都是相同的,因此更改一个也会改变其他对象:In [151]: some_list = 4 * [(4 * [0])]  In [152]: [id(x) for x in some_list]Out[152]: [148641452, 148641452, 148641452, 148641452]In [160]: some_list[0][1]=5  #you think you changed the list at index 0 hereIn [161]: some_listOut[161]: [[0, 5, 0, 0], [0, 5, 0, 0], [0, 5, 0, 0], [0, 5, 0, 0]]  #but all lists are changed以如下方式创建列表:In [156]: some_list=[[0]*4 for _ in range(4)]In [157]: some_listOut[157]: [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]In [158]: [id(x) for x in some_list]Out[158]: [148255436, 148695180, 148258380, 148255852]In [163]: some_list[0][1]=5In [164]: some_listOut[164]: [[0, 5, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]  #works fine in this case
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python