Python:list.extend和list.__iadd__的区别

5 投票
1 回答
1149 浏览
提问于 2025-04-18 05:59

我原以为 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 被标记为全局变量。

撰写回答