【问题标题】:Python: Difference between list.extend and list.__iadd__ [duplicate]Python:list.extend 和 list.__iadd__ 之间的区别 [重复]
【发布时间】:2014-06-27 05:07:58
【问题描述】:

我认为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 中试过这个。

【问题讨论】:

标签: python


【解决方案1】:

+= 为对象提供了机会就地改变对象。但这取决于x 的类型,并不是说对象被原地改变了。

因此,+= 仍然需要重新分配xx.__iadd__() 要么返回 x,要么返回一个新对象; x += something 真的翻译成:

x = x.__iadd__(something)

因为+= 包含一个赋值,xg() 中被标记为本地。

另一方面,x.extend() 不是分配。程序员决定x 始终是一个带有.extend() 方法的对象,并直接使用它。 Python 看不到任何赋值,x 被标记为全局。

【讨论】:

猜你喜欢
  • 2015-05-22
  • 2015-07-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 2014-08-16
  • 2011-04-08
相关资源
最近更新 更多