Python:list.extend和list.__iadd__的区别
我原以为 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 个回答
12
+=
让一个对象有机会在原地进行修改。但这要看 x
的类型,并不一定所有对象都会被原地修改。
因此,+=
仍然需要重新赋值给 x
;要么 x.__iadd__()
返回的是 x
本身,要么返回一个新对象;实际上 x += something
可以理解为:
x = x.__iadd__(something)
因为 +=
包含了赋值操作,所以在 g()
函数中,x
被标记为局部变量。
而 x.extend()
则不是赋值操作。程序员已经决定 x
始终是一个有 .extend()
方法的对象,并直接使用它。Python 没有看到赋值操作,因此 x
被标记为全局变量。