confused about adding elements to a list with list.append(otherlist)
Hans Nowak
hnowak at cuci.nl
Mon Aug 13 07:46:29 EDT 2001
>===== Original Message From tist.verdonck at mailandnews.com (Tist Verdonck)
=====
>I got this problem where I have an empty list and I want to fill it up
>with other lists using a for-iteration:
>
>list = []
>data = ['ab','cd','de','ef','gh']
>z = len(data)
>for x in range(z):
> list.append(data)
> data.append('IJ')
list.append(data) adds a reference to data to the list. You end up with a list
of references to the same object (data); that data changed during the loop is
irrelevant in this situation.
Use list.append(data[:]) instead and the code will do what you intended (this
will add a copy of data to the list).
>I think it must have something to do with me having problems with
>python's use of variables (not copying them but making references to them)
Yes, Python doesn't implicitly copy objects. In a language like C,
int a, b = 42;
a = b;
copies the value of b to a, but in Python
b = 42
a = b
a binding is created (b referring to an integer object with value 42), then a
refers to that same object. Since integers are immutable, their behavior is
unsurprising, because
a = 28
will not change the value of b, just like "a = 28;" in C would not change the
value of b.
Mutable objects behave the same way, really:
b = [1, 2, 3]
a = b
Now a and b refer to the same object, a list. And
a = [4, 5]
does not change the value of b; it simply binds a to a new list with value
[4,5]. Problems only occur in situations like
b = [1, 2, 3]
a = b
a.append(4)
when people don't realize that mutating a also affects b, because they're the
same object.
HTH,
--Hans Nowak
More information about the Python-list
mailing list