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

Python: Difference between list.extend and list.__iadd__

本问题已经有最佳答案,请猛点这里访问。

我认为列表上的list.extend和"+="基本上都是一样的-扩展列表而不创建新列表。

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

为什么会出现这个错误?区别在哪里?

1
2
3
4
5
6
7
8
def f():
    x.extend([43, 44])
def g():
    x += ([45, 46])
x = [42]
f()
g()
print x

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


+=给一个对象机会改变对象的位置。但这取决于x的类型,并不是因为物体被适当地改变了。

因此,+=仍然需要重新分配给x;或者x.__iadd__()返回x或者返回一个新对象;x += something实际上被转换为:

1
x = x.__iadd__(something)

由于+=包含一个赋值,所以xg()中标记为本地。

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