连接两个列表 - ‘+=’和extend()的区别
我发现其实在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
要稍微贵一些。
其实这根本不需要你担心,除非你要执行这个操作的次数达到数十亿次。不过,实际上瓶颈可能出现在其他地方。