按索引分配列表列表的元素设置列表的所有第一个元素

Assigning element of list of lists by index sets all first elements of the lists

我有一个列表,每个月有 3 个值,初始化如下:

v=[[0.0,0.0,0.0]]*12

在 2 个嵌套循环中,我想向元素添加一个值:

v[month-1][pos] += row[0]

在执行代码 month-1 = 8pos = 0 的某一时刻。 row[0] 我从数据库查询得到的是 1.0

奇怪的是我得到了 [[1.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0,....
所以每个子列表的第一个元素都设置为1.0。这怎么会发生?更奇怪的是,如果我调试代码并手动设置值 v[8][0]=9 左右,它会按预期工作。

当你这样做时v=[[0.0,0.0,0.0]]*12你会得到一个列表,其中有 12 个引用到同一个列表,要解决这个问题,请改用理解:

v = [[0.0,0.0,0.0] for _ in range(12)]

通常这样使用的 * 不应该用于可变元素。