对象的动态长度列表,其中每个对象的键值都被重新分配,无论指定哪个列表索引,但静态列表函数

Dynamic length list of objects where each object's key-values are reassigned regardless of which list index is specified, but static list functions

这里是第一个问题,请放轻松。

我正在尝试分配一个对象列表,这些对象代表一个大二进制字符串输入的每个索引位置处的 1 和 0 累加器,例如:011011101。

我想读取输入的第一行以获取二进制字符串的长度,然后分配一个看起来像 -> "[ {0:0, 1:0} ] 的变量* len(n)" 为了简洁起见,我知道所有行的长度都是 12。

My objective:循环遍历一行中的每个项目,并将 1 添加到该索引位置的对象键的 1 或 0。 -> "arr[i][v] += 1"

i 表示字符串索引和我想在动态大小数组中访问的对象

v 表示我要递增 1 的第 i 个位置的对象的键(0 或 1)

通过这种方式,我可以计算出给定输入的每个位置有多少个 1 或 0。

简化代码: ` 输入 = ["010101101100", "110001101101"] arr = [{ 0:0,1:0 }] * len(输入[0])

对于输入行: 对于 i,v 在枚举(行)中: v = 整数(v) arr[i][v] += 1 打印(arr) `

WRONG Result!

但是,如果我这样明确设置列表:

input = ["010101101100", "110001101101"]
arr = [
{ 0:0,1:0 },
{ 0:0,1:0 },
{ 0:0,1:0 },
{ 0:0,1:0 },
{ 0:0,1:0 },
{ 0:0,1:0 },
{ 0:0,1:0 },
{ 0:0,1:0 },
{ 0:0,1:0 },
{ 0:0,1:0 },
{ 0:0,1:0 },
{ 0:0,1:0 }
]

for i, v in enumerate(input):
    v = int(v)
    arr[i][v] += 1
print(arr)

The correct Answer!

这里到底发生了什么?为什么访问动态列表的循环将加法应用于每个对象和相应的键值对?

我确定这是一些计算机科学的东西,我只是没有得到。

这不会让我的头爆炸的唯一原因是我可以看到输入,我可以明确地设置列表,但如果长度未知,那将是一个问题

当您使用 * 时,Python 会创建一个列表,其中每个元素都引用相同的对象。因此,修改一个元素最终会修改所有元素。

arr = [{0:0, 1:0}] * 12  # this creates a list where every element is the same dictionary
arr = [{0:0, 1:0} for _ in range(12)]  # this creates a list containing 12 independent dictionaries