如何在python for循环中添加一个列表到另一个列表,当现有列表的每个元素在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时,它实质上使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)

我认为问题在于您传递r1到r2的指针。R1在for循环的作用域之外创建,但在for循环内部更改。因此,r2看到的是r1在其最后状态下的2个实例,即['H', 'HI']。

尝试将子数组直接传递给r2,如r2.append([i, i + 'I'])

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

最新更新