我试图写一个代码,将创建修改后的列表,每次循环,并将其追加到一个新的列表。为此,我尝试创建一个空的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']))