python-3.x - 为什么迭代和修改嵌套列表中的每个元素会导致一些错误的输出?
问题描述
不可变和可变导致问题。
我试图将矩阵顺时针旋转 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]]" 在函数的末尾。
解决方案
您看到了错误,因为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]]
推荐阅读
- node.js - 将 Typescript 类重构为两个函数
- c++ - 使用球体体积进行 Pi 估计
- python - 使用 for 循环查找列表中具有相同值的元素之间的元素
- python - Pandas DataFrame 中的年初至今返回
- laravel - 在 Laravel 上使用 Sail 时没有匹配的清单错误
- php - 如何将html表单的总、平均和等级放入mysql数据库
- asp.net - 登录功能在我的 mvc 5 应用程序中工作,但经过一些操作后它会自动注销
- sql-server - Sql查询以获取匹配和不匹配记录的计数
- python - 尽管有 conda 3.6 环境,但 Python 版本 2.7
- r - 连续小波变换 - 日期未以正确格式显示