循环中为嵌套列表赋值时Numpy的mean、max、min函数返回异常结果
Python嵌套列表赋值异常问题分析与解决
问题代码
from numpy import mean, max, min table = [[0] * 3] * 2 for i, l in enumerate([[1, 2, 3], [4, 5, 6]]): print(l) table[i][0] = mean(l) table[i][1] = max(l) table[i][2] = min(l) print(table)
现象
运行时print(l)输出正常,但最终table结果不符合预期:
- 实际输出:
[1, 2, 3] [4, 5, 6] [[5.0, 6, 4], [5.0, 6, 4]]
- 预期输出:
[1, 2, 3] [4, 5, 6] [[2.0, 3, 1], [5.0, 6, 4]]
原因分析
问题出在嵌套列表的创建方式:[[0] * 3] * 2并不是创建两个独立的长度为3的子列表,而是把[0,0,0]这个列表对象的引用复制了两次。也就是说,table[0]和table[1]指向的是同一个内存地址的列表。
当第一次循环修改table[0][0]、table[0][1]、table[0][2]时,其实是修改了那个共享的子列表;第二次循环修改table[1]对应的元素时,还是修改同一个子列表,最终两次修改的结果会覆盖,导致两个子列表内容完全相同。
解决方案
改用列表推导式创建独立的子列表,确保每个子列表都是全新的对象:
from numpy import mean, max, min # 用列表推导式创建嵌套列表,每个子列表独立 table = [[0] * 3 for _ in range(2)] for i, l in enumerate([[1, 2, 3], [4, 5, 6]]): print(l) table[i][0] = mean(l) table[i][1] = max(l) table[i][2] = min(l) print(table)
运行修改后的代码,就能得到预期输出:
[1, 2, 3] [4, 5, 6] [[2.0, 3, 1], [5.0, 6, 4]]
内容的提问来源于stack exchange,提问作者edvardf
相关产品推荐
相关产品推荐

