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

标签 python

<分区>

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

最佳答案

+= 给对象机会就地改变对象。但这取决于 x 的类型,并不能保证对象已就地更改。

因此,+=仍然需要重新分配xx.__iadd__() 返回 x,或者返回一个新对象; x += something 实际翻译为:

x = x.__iadd__(something)

因为 += 包含赋值,所以 xg() 中被标记为局部。

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

关于Python:list.extend 和 list.__iadd__ 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23564955/

相关文章:

Python 多处理/EM

python - 成对测试 Pandas 数据框的统计显着性

python - 递归调用函数

python - 如何使用正则表达式提取 Pandas 数据框中的特定内容?

python - 制作一个文件搜索程序,它接受带有 sys.argv 的单个正则表达式。

python - 如何在Python中将远程位置的文件名转换为字符串?

python - 使用变量访问 python 类中的函数

python - 为什么我的 Python 程序的输出看起来像这样(很奇怪)?

python - 输入时从列表列表中获取最接近的元素

返回缩进字符串的 Python 三引号