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

时间:2014-05-09 12:42:05

标签: 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

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

1 个答案:

答案 0 :(得分:9)

+=为对象提供了机会来就地修改对象。但这取决于x的类型,并不是对象在适当的位置被改变。

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

x = x.__iadd__(something)

由于+=包含作业,xg()中被标记为本地。

另一方面,

x.extend()不是作业。程序员已经确定x始终是具有.extend()方法的对象并直接使用它。 Python看不到赋值,x被标记为全局。