首页 > 解决方案 > 为什么迭代和修改嵌套列表中的每个元素会导致一些错误的输出?

问题描述

不可变和可变导致问题。

我试图将矩阵顺时针旋转 90 度而不更改函数中传递的参数。

def rotate(m):
    rm=[[0]*len(m)]*(len(m))
    print("m:",m)
    print("rm:",rm)
    for j in range(len(rm)):
        for i in range(len(rm)):
            k=m[j][i]
            y=(len(rm)-j-1)
            rm[i][y] = k
            print(i," ",len(rm)-j-1," ",rm[i][(len(rm)-j-1)])
    print("m:",m)
    print("rm:",rm)
    return rm

 print(rotate([[1,2,3],[4,5,6],[7,8,9]]))

我希望 rm 应该是 "[[7, 4, 1], [8, 5, 2], [9, 6, 3]]" 但它是 "[[9, 6, 3], [9, 6 , 3], [9, 6, 3]]" 在函数的末尾。

标签: python-3.xlistnested-lists

解决方案


您看到了错误,因为rm=[[0]*len(m)]*(len(m)). 尝试将其更改为:

rm = [[0 for _ in range(len(m))] for _ in range(len(m))]

注意:上面的函数可以改写为:

l = [[1,2,3],[4,5,6],[7,8,9]]

def rotate(lst):
    return [list(val[::-1]) for val in zip(*lst)]

print(rotate(l))

这打印:

[[7, 4, 1], [8, 5, 2], [9, 6, 3]]

推荐阅读