Python:list.extend和list .__ iadd__之间的区别

yaf*_*nee 3 python

我认为list.extend列表中的"+ ="基本上做同样的事情 - 扩展列表而不创建新列表.

我希望下面的代码可以打印,[42, 43, 44, 45, 46]但我得到了UnboundLocalError: local variable 'x' referenced before assignment

为什么我收到此错误?区别在哪里?

def f():
    x.extend([43, 44])
def g():
    x += ([45, 46])
x = [42]
f()
g()
print x
Run Code Online (Sandbox Code Playgroud)

我在python2.7.3和python3.4.0中尝试过这个.

Mar*_*ers 9

+=使对象有机会就地改变对象.但这取决于类型x,不是给定对象被改变的地方.

因此,+= 仍需要重新分配x; 要么x.__iadd__()返回x,要么返回一个新对象; x += something真的被翻译成:

x = x.__iadd__(something)
Run Code Online (Sandbox Code Playgroud)

因为+=包含一个赋值,x被标记为本地g().

x.extend()另一方面,不是任务.程序员已经决定使用方法x始终是一个对象.extend()并直接使用它.Python看不到任何赋值,x并被标记为全局.