当在 for 循环内更改现有列表的每个元素时,如何将列表附加到 python for 循环中的另一个列表?

How to append a list to another list in a python for loop when each element of the existing list is being changed inside the for loop?

我正在尝试编写一个代码,每次都会在 for 循环中创建修改后的列表,并将其附加到新列表中。为此,我尝试创建一个空的 numpy 数组,其中包含两个元素,这两个元素将在遍历字典元素的 for 循环中进行修改。

r2 = []
r1 = np.empty(2, dtype = object)
r1 = r1.tolist()
r_1 = {'G':32,'H':3}
for i in r_1:
    r1[0] = i
    r1[1] = i + 'I'
    print(r1)    
    r2.append(r1)
print(r2)

这给了我 r2 作为

[['H', 'HI'], ['H', 'HI']]

每次迭代中的 r1 值都符合预期。但是,我希望 r2 成为

[['G', 'GI'], ['H', 'HI']]

我不知道为什么 append() 不能正常工作。我也通过 extend() 尝试了同样的事情,但同样的事情发生在 extend([r1]) 而在 extend(r1) 上它给了我

['G', 'GI','H', 'HI']

是我做错了还是代码在解释别的东西?

我认为问题在于您将 r1 的指针传递给了 r2。 r1 在 for 循环范围外创建,但在 for 循环内更改。因此,r2 看到的是 r1 在其最后状态的 2 个实例,即 ['H'、'HI'].

尝试像 r2.append([i, i + 'I'])

一样将子数组直接传递给 r2

如果你需要r2中的numpy数组,你可以r2.append(np.array([i, i + 'I']))

当您将 r1 两次附加到 r2 时,它实际上使 r2 成为 [r1, r1] 的列表,而不是附加时 r1 的内容,因此,当 r1 在第二次附加之前更改时, r2 中引用 r1 的第一个元素也会更改。

一种解决方案是完全不使用 r1 并直接附加内容:

r2 = []
r_1 = {'G':32,'H':3}
for i in r_1:
    r2.append([i, i+"I"])
print(r2)

第二种解决方案是附加 r1 的副本以避免两个元素具有相同的引用:

r2 = []
r_1 = {'G':32,'H':3}
r1 = [None, None]
for i in r_1:
    r1[0] = i
    r1[1] = i + "I"
    r2.append(r1.copy())
print(r2)