I simplified my code to get the error I required.
one = ['x']
two = ['y']
final_data = []
for r in range(1, 3):
print(final_data, r)
if r == 2:
one[0] = two[0]
print(one)
final_data.append(one)
print(final_data)
print(final_data)
The final data in 2nd loop is not modified but the end result is coming [['y'], ['y']]
even though
I expect it to come as [['x'], ['y']]
CodePudding user response:
In this line one[0] = two[0]
you change the value in list one
and in the end when you print final_data
you get [['y'], ['y']]
because in list one
you have 'y'
.
You need for each iteration to create a copy of one
. To copy a list you can use [:]
. Then after you do what you want with one
, copy old_one
to one
.
...
old_one = one[:]
...
one = old_one[:]
Try this:
one = ['x']
two = ['y']
final_data = []
for r in range(1, 3):
print(final_data, r)
old_one = one[:]
if r == 2:
one[0] = two[0]
print(one)
final_data.append(one)
one = old_one[:]
print(final_data)
print(final_data)
CodePudding user response:
In short:
final_data.append( one )
does not add the contents of list one
but a reference to the list called one
to final_data
.
In C / C terminology, a "pointer" (or "reference") to list one
is added such that by the time r==2
:
final_data = [ <reference to `one`>, <reference to `one`> ]
So by modifying one[0]
to be one[0] = two[0]
, the contents of one
are changed and consequently final_data
will see those changes too.
Possibly a simpler solution is to:
import copy
...
final_data.append( copy.deepcopy(one) )
copy.deepcopy()
generates - as the name implies - a full copy of the object, such that now a reference to a new list
will be added to final_data
in stead of (yet another) reference to the list called one
.