使用+=
与列表就像调用extend
,不+
。
- 您可以使用迭代器调用
extend
。
- 您只能使用
+
与另一个列表。
我只能猜测为什么做出这个决定,但我想它是出于性能原因。调用+
会导致创建新对象并复制所有项目,而在某些情况下,extend
可以使用现有列表对象中的可用空间来保存副本。
此决定的另一个副作用是,如果您编写x += y
其他引用列表将看到更改,但如果您使用x = x + y
那么他们不会。下面展示了这种:
>>> x = ['a','b']
>>> y = ['c', d']
>>> z = x
>>> x += y
>>> z
['a', 'b', 'c', 'd']
>>> x = ['a','b']
>>> y = ['c', d']
>>> z = x
>>> x = x + y
>>> z
['a', 'b']
参考
Python source code for list。
为+=
的源代码:
static PyObject *
list_inplace_concat(PyListObject *self, PyObject *other)
{
PyObject *result;
result = listextend(self, other);
if (result == NULL)
return result;
Py_DECREF(result);
Py_INCREF(self);
return (PyObject *)self;
}
源代码+
:
static PyObject *
list_concat(PyListObject *a, PyObject *bb)
{
Py_ssize_t size;
Py_ssize_t i;
PyObject **src, **dest;
PyListObject *np;
if (!PyList_Check(bb)) {
PyErr_Format(PyExc_TypeError,
"can only concatenate list (not \"%.200s\") to list",
bb->ob_type->tp_name);
return NULL;
}
// etc ...
我“同意”您的问题;这对于我来说是反对运营商重载的一个很好的理由。 – u0b34a0f6ae 2010-07-09 21:35:50
在编辑之后删除了我的答案 - 看起来你对不支持列表和迭代器之间的原因感到疑惑 - 我的错误。 除了说,“是的,为什么不呢?”,我没有答案。 – 2010-07-09 21:40:16
这是一个*重大*破损。更一般地说,任何为相同外观的操作员定义不同行为的语言或库应该被视为用户敌对的。没有人会使用'+'来表示字符串连接:该操作不可交换! – 2010-07-09 21:40:20