我看到在Python中实际上有两种(可能更多)方法来连接列表:

一种方法是使用extend()方法:

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

另一个使用加号(+)运算符:

b += a

现在我想知道:这两个选项中哪一个是“python”的方式来做列表连接,两者之间有区别吗?(我已经查阅了官方的Python教程,但找不到任何关于这个主题的任何东西)。


当前回答

我想说,有一些不同,当它与numpy(我刚刚看到的问题是关于连接两个列表,而不是numpy数组,但由于它可能是初学者的问题,如我,我希望这可以帮助谁寻求这篇文章的解决方案),对于ex。

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

它将返回错误

ValueError:操作数不能与形状(0,)(4,4,4)一起广播

B.extend (a)工作完美

其他回答

我想说,有一些不同,当它与numpy(我刚刚看到的问题是关于连接两个列表,而不是numpy数组,但由于它可能是初学者的问题,如我,我希望这可以帮助谁寻求这篇文章的解决方案),对于ex。

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

它将返回错误

ValueError:操作数不能与形状(0,)(4,4,4)一起广播

B.extend (a)工作完美

你可以链式调用函数,但你不能直接+=函数调用:

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

当列表在元组中时,只能使用.extend()

这是可行的

t = ([],[])
t[0].extend([1,2])

而这个不会

t = ([],[])
t[0] += [1,2]

原因是+=生成了一个新对象。如果你看一下长版本:

t[0] = t[0] + [1,2]

你可以看到这会改变元组中的对象,这是不可能的。使用.extend()修改元组中的对象,这是允许的。

来自CPython 3.5.2源代码: 差别不大。

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;
}

根据Python进行数据分析。

注意,通过加法连接列表是一个相对昂贵的操作,因为必须创建一个新的列表并复制对象。使用extend将元素附加到现有列表,特别是如果您正在构建一个大型列表,通常是更可取的。” 因此,

everything = []
for chunk in list_of_lists:
    everything.extend(chunk)

比连接替代更快:

everything = []
for chunk in list_of_lists:
    everything = everything + chunk