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中试过这个。
- @200好的:不,不是真的。这就是为什么python认为x在f中是全局的,在g中是局部的。
- @MartijnPieers这个怎么样:在函数内部和外部修改python全局列表
- @200ok:找到一个更规范的版本。
+=给一个对象机会改变对象的位置。但这取决于x的类型,并不是因为物体被适当地改变了。
因此,+=仍然需要重新分配给x;或者x.__iadd__()返回x或者返回一个新对象;x += something实际上被转换为:
1
| x = x.__iadd__(something) |
由于+=包含一个赋值,所以x在g()中标记为本地。
另一方面,x.extend()不是一项任务。程序员已经决定,x始终是一个使用.extend()方法的对象,并直接使用它。python没有看到赋值,x被标记为全局。
- 我同意。x."iadd"正在返回列表,源代码:hg.python.org/cpython/file/db842f730432/objects/…