Why do these two operations (append()
resp. +
) give different results?
>>> c = [1, 2, 3]
>>> c
[1, 2, 3]
>>> c += c
>>> c
[1, 2, 3, 1, 2, 3]
>>> c = [1, 2, 3]
>>> c.append(c)
>>> c
[1, 2, 3, [...]]
>>>
In the last case there's actually an infinite recursion. c[-1]
and c
are the same. Why is it different with the +
operation?
This question is related to
python
list
append
nested-lists
The method you're looking for is extend()
. From the Python documentation:
list.append(x)
Add an item to the end of the list; equivalent to a[len(a):] = [x].
list.extend(L)
Extend the list by appending all the items in the given list; equivalent to a[len(a):] = L.
list.insert(i, x)
Insert an item at a given position. The first argument is the index of the element before which to insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is equivalent to a.append(x).
append
is appending an element to a list. if you want to extend the list with the new list you need to use extend
.
>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
See the documentation:
list.append(x)
- Add an item to the end of the list; equivalent to a[len(a):] = [x].
list.extend(L) - Extend the list by appending all the items in the given list; equivalent to a[len(a):] = L.
c.append(c)
"appends" c to itself as an element. Since a list is a reference type, this creates a recursive data structure.
c += c
is equivalent to extend(c)
, which appends the elements of c to c.
you should use extend()
>>> c=[1,2,3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
other info: append vs. extend
Python lists are heterogeneous that is the elements in the same list can be any type of object. The expression: c.append(c)
appends the object c
what ever it may be to the list. In the case it makes the list itself a member of the list.
The expression c += c
adds two lists together and assigns the result to the variable c
. The overloaded +
operator is defined on lists to create a new list whose contents are the elements in the first list and the elements in the second list.
So these are really just different expressions used to do different things by design.
The concatenation operator +
is a binary infix operator which, when applied to lists, returns a new list containing all the elements of each of its two operands. The list.append()
method is a mutator
on list
which appends its single object
argument (in your specific example the list c
) to the subject list
. In your example this results in c
appending a reference to itself (hence the infinite recursion).
The list.extend()
method is also a mutator method which concatenates its sequence
argument with the subject list
. Specifically, it appends each of the elements of sequence
in iteration order.
Being an operator, +
returns the result of the expression as a new value. Being a non-chaining mutator
method, list.extend()
modifies the subject list in-place and returns nothing.
I've added this due to the potential confusion which the Abel's answer above may cause by mixing the discussion of lists, sequences and arrays.
Arrays
were added to Python after sequences and lists, as a more efficient way of storing arrays of integral data types. Do not confuse arrays
with lists
. They are not the same.
From the array docs:
Arrays are sequence types and behave very much like lists, except that the type of objects stored in them is constrained. The type is specified at object creation time by using a type code, which is a single character.
Source: Stackoverflow.com