Python3.9.6下numpy.matrix()处理嵌套列表报错原因求解
问题解答
核心认知偏差纠正
你出现误解的核心原因是对Python可变对象的传参逻辑认知不到位:
- Python中的列表属于可变对象,作为参数传入函数时传递的是对象的内存引用,而非独立副本。
- 你的
clean_input函数内对row执行的元素赋值、append()操作,都是直接修改传入的原列表对象,并不会自动生成新列表。因此你遍历row_list调用函数的过程中,row_list内的所有子列表已经被同步修改,和你是否把返回值存入clear_list没有关系。
两种运行现象的原因解释
1. 保留第40行print(np.matrix(row_list))时报错
执行第40行代码时,还未运行后续的clean_input调用逻辑,此时row_list内的子列表长度参差不齐(比如list(row3)是空列表,list(row5)长度为1)。numpy将长度不一致的嵌套序列转为矩阵/数组时,就会触发你看到的VisibleDeprecationWarning警告,输出的是object类型的不规则数组,不符合9*9的预期。
2. 删除第40行print后运行正常
删除第40行后,执行print逻辑前已经跑完了遍历调用clean_input的循环,此时row_list内的所有子列表都被修改为长度为9的列表,嵌套序列长度统一,numpy转矩阵时不会触发警告,会正常输出9*9的字符矩阵。
修复建议
如果你不希望调用clean_input时修改原row_list的内容,可以在传参时传入子列表的拷贝:
for element in row_list: # 传入列表的浅拷贝,修改不会影响原列表 clear_list.append(clean_input(element.copy()))
内容的提问来源于stack exchange,提问作者Charan Reigns
相关产品推荐
相关产品推荐

