我认为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中试过这个。
答案 0 :(得分:9)
+=
为对象提供了机会来就地修改对象。但这取决于x
的类型,并不是对象在适当的位置被改变。
因此,+=
仍然需要重新分配到x
;要么x.__iadd__()
返回x
,要么返回一个新对象; x += something
真的被翻译为:
x = x.__iadd__(something)
由于+=
包含作业,x
在g()
中被标记为本地。
x.extend()
不是作业。程序员已经确定x
始终是具有.extend()
方法的对象并直接使用它。 Python看不到赋值,x
被标记为全局。