简体   繁体   中英

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?

I am trying to write a code which will create modified lists in a for loop every time and append it to a new list. For this, I tried creating an empty numpy array with two elements which are to be modified inside the for loop iterating over dictionary elements.

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)

which gives me r2 as

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

The r1 values in each iteration are as expected. However, I am expecting r2 to be

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

I don't know why append() is not working properly. I also tried the same by doing extend() but the same thing happens on doing extend([r1]) whereas on doing extend(r1) it gives me

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

Am I doing it wrong or the code is interpreting something else?

I think that the problem lies with the fact that you pass a pointer of r1 to r2. r1 is created outside the scope of the for loop but is changed inside the for loop. So, what r2 sees is 2 instances of r1 at its last state, which is ['H', 'HI'].

Try passing the subarray directly to r2 like r2.append([i, i + 'I'])

If you need a numpy array in r2, you can do r2.append(np.array([i, i + 'I']))

When you append r1 twice to r2 it essentially makes r2 a list of [r1, r1] not the contents of r1 when it was appended, so when r1 is changed before the second append, the first element in r2 which is a reference to r1 is also changed.

One solution is to not use r1 at all and just append the contents directly:

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

A second solution is to append a copy of r1 to avoid the two elements having the same reference:

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM