Home » Python » Concatenating two lists – difference between '+=' and extend()

Concatenating two lists – difference between '+=' and extend()

Posted by: admin November 1, 2017 Leave a comment

Questions:

I’ve seen there are actually two (maybe more) ways to concatenate lists in Python:
One way is to use the extend() method:

a = [1, 2]
b = [2, 3]
b.extend(a)

the other to use the plus(+) operator:

b += a

Now I wonder: Which of those two options is the ‘pythonic’ way to do list concatenation and is there a difference between the two (I’ve looked up the official Python tutorial but couldn’t find anything anything about this topic).

Answers:

The only difference on a bytecode level is that the .extend way involves a function call, which is slightly more expensive in Python than the INPLACE_ADD.

It’s really nothing you should be worrying about, unless you’re performing this operation billions of times. It is likely, however, that the bottleneck would lie some place else.

Questions:
Answers:

You can’t use += for non-local variable (variable which is not local for function and also not global)

def main():
    l = [1, 2, 3]

    def foo():
        l.extend([4])

    def boo():
        l += [5]

    foo()
    print l
    boo()  # this will fail

main()

It’s because for extend case compiler will load the variable l using LOAD_DEREF instruction, but for += it will use LOAD_FAST – and you get *UnboundLocalError: local variable 'l' referenced before assignment*

Questions:
Answers:

You can chain function calls, but you can’t += a function call directly:

class A:
    def __init__(self):
        self.listFoo = [1, 2]
        self.listBar = [3, 4]

    def get_list(self, which):
        if which == "Foo":
            return self.listFoo
        return self.listBar

a = A()
other_list = [5, 6]

a.get_list("Foo").extend(other_list)
a.get_list("Foo") += other_list  #SyntaxError: can't assign to function call

Questions:
Answers:

According to the Zen of Python:

Simple is better than complex.

b += a is more simple than b.extend(a).

The builtins are so highly optimized that there’s no real performance difference.

Questions:
Answers:

I would say that there is some difference when it comes with numpy (I just saw that the question ask about concatenating two lists, not numpy array, but since it might be a issue for beginner, such as me, I hope this can help someone who seek the solution to this post), for ex.

import numpy as np
a = np.zeros((4,4,4))
b = []
b += a

it will return with error

ValueError: operands could not be broadcast together with shapes (0,) (4,4,4)

b.extend(a) works perfectly

Questions:
Answers:

From python 3.5.2 source code:
No big difference.

static PyObject *
list_inplace_concat(PyListObject *self, PyObject *other)
{
    PyObject *result;

    result = listextend(self, other);
    if (result == NULL)
        return result;
    Py_DECREF(result);
    Py_INCREF(self);
    return (PyObject *)self;
}