连接两个列表 - ‘+=’和extend()的区别

355 投票
12 回答
115154 浏览
提问于 2025-04-16 03:46

我发现其实在Python中,有两种(可能还有更多)方法可以把列表合并在一起:

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

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

另一种方法是用加号(+)操作符:

b += a

现在我想知道:这两种方法中,哪一种是更“Python风格”的列表合并方式?它们之间有什么区别吗?(我查过官方的Python教程,但没找到关于这个话题的内容)。

12 个回答

76

你可以把多个函数调用连在一起使用,但你不能直接把一个函数调用的结果用 += 来加到某个变量上。

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
246

你不能对非本地变量使用 +=(也就是既不是函数内部的变量,也不是全局变量)

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

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

    def boo():
        l += [5]

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

main()

这是因为在 extend 的情况下,编译器会用 LOAD_DEREF 指令来加载变量 l,但是在使用 += 时,它会用 LOAD_FAST 指令来加载,这样就会出现 *UnboundLocalError: local variable 'l' referenced before assignment* 的错误。

304

在字节码层面上,唯一的区别是使用.extend方法时需要调用一个函数,而这个在Python中比使用INPLACE_ADD要稍微贵一些。

其实这根本不需要你担心,除非你要执行这个操作的次数达到数十亿次。不过,实际上瓶颈可能出现在其他地方。

撰写回答