[Tutor] reg. list update
D.V.N.Sarma డి.వి.ఎన్.శర్మ
dvnsarma at gmail.com
Mon Apr 17 20:19:33 EDT 2017
This is an aliasing problem. Change the code to
super = []
sub = [""]*3
other = ["a","b","c","d"]
sub[0] = "hi"
sub[1] = "hello"
for item in other:
l = sub[:]
l[2] = item
super.append(l)
for item in super:
print item
regards,
Sarma.
On Tue, Apr 18, 2017 at 2:16 AM, Mats Wichmann <mats at wichmann.us> wrote:
> On 04/17/2017 12:41 PM, Rasika Sapate via Tutor wrote:
> > Dear Python group,
> > I had written following code.
> >
> > super = []
> > sub = [""]*3
> > other = ["a","b","c","d"]
> > sub[0] = "hi"
> > sub[1] = "hello"
> > for item in other:
> > sub[2] = item
> > super.append(sub)
> > for item in super:
> > print item
> >
> >
> > Output :
> > ['hi', 'hello', 'd']
> > ['hi', 'hello', 'd']
> > ['hi', 'hello', 'd']
> > ['hi', 'hello', 'd']
> >
> >
> > Expected output:
> > ['hi', 'hello', 'a]
> > ['hi', 'hello', 'b']
> > ['hi', 'hello', 'c']
> > ['hi', 'hello', 'd']
> >
> >
> > Is there anything wrong in this code or any feature of python?
>
> yeah, feature of Python. you could google for "deep copy".
>
> in short, sub[2] ends up with a reference to, not a copy of, the object
> referenced by "item" in the first for loop. all four lists hold this
> reference. by the time you go to print, that's a reference to the value
> "item" held when the first loop exited, or 'd'. item itself no longer
> refers to that, you assign new things to it.
>
> You can see this by adding a couple of debug print lines
>
> super = []
> sub = [""]*3
> other = ["a","b","c","d"]
> sub[0] = "hi"
> sub[1] = "hello"
> for item in other:
> sub[2] = item
> print "item id:", id(item)
> super.append(sub)
> for item in super:
> print item
> print "item[2] id:", id(item[2])
> _______________________________________________
> Tutor maillist - Tutor at python.org
> To unsubscribe or change subscription options:
> https://mail.python.org/mailman/listinfo/tutor
>
More information about the Tutor
mailing list