Python二维列表循环赋值后输出异常,求原因解释
问题根源与修复方案
你遇到的这个问题,核心出在二维列表的初始化方式上——就是这行代码:
sort_list = [[0]*cols]*rows
为什么会出问题?
当你用[x] * n的方式创建列表时,如果x是可变对象(比如这里的子列表[0]*cols),那么生成的n个元素其实都是同一个对象的引用。换句话说,sort_list[0]和sort_list[1]指向的是同一个列表,不是两个独立的列表!
所以你在循环里做这些操作时:
sort_list[0][i] = dist_list[0][index] sort_list[1][i] = dist_list[1][index]
其实是在反复修改同一个列表:先给这个列表的第i位赋值dist_list[0][index],然后又把它改成dist_list[1][index]。循环里单独打印sort_list[0][i]时看起来正常,但实际上sort_list[0]和sort_list[1]始终是同一个东西,最后自然会输出完全相同的内容。
怎么修复?
要创建真正独立的子列表,改用列表推导式来初始化二维列表:
sort_list = [[0]*cols for _ in range(rows)]
这个写法会循环rows次,每次都生成一个全新的[0]*cols子列表,每个子列表都是独立的对象,修改其中一个不会影响另一个。
修复后的完整代码
把你的代码修改后应该是这样:
dist_list = [[1,5,9,40,8],[95,77,34,50,60]] rows = 2 # len(dist_list) cols = len(dist_list[1]) sort_list = [[0]*cols for _ in range(rows)] # 这里是修改的地方 tempo = sorted(dist_list[1]) for i in range(cols): index = dist_list[1].index(tempo[i]) sort_list[0][i] = dist_list[0][index] print(sort_list[0][i]) # 现在值正确 sort_list[1][i] = dist_list[1][index] print(sort_list[0][i]) # 现在值依然正确 print(dist_list) print(sort_list[0]) # 正常输出预期结果 print(sort_list[1])
运行这段代码后,sort_list就会按照你的预期,第一个子列表对应dist_list[0]按dist_list[1]排序后的结果,第二个子列表是排序后的dist_list[1]。
内容的提问来源于stack exchange,提问作者SeaHippo
相关产品推荐
相关产品推荐

