mas*_*ley 46 python list operators
从我所知的很少,+ op for lists只需要第二个操作数可迭代,"ha"显然是.
在代码中:
>>> x = []
>>> x += "ha"
>>> x
['h', 'a']
>>> x = x + "ha"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 31
使用+=列表就像打电话extend,而不是+.
extend使用iterable 调用.+其他列表.我只能猜到为什么做出这个决定,但我想这是出于性能原因.调用会+导致创建一个新对象并复制所有项目,而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']
参考
源代码+=:
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 ...
你正在考虑倒退.你问为什么x = x + 'ha'抛出异常,因为它x += 'ha'有效.真的,问题是为什么要x += 'ha'工作.
每个人都同意(我希望)'abc' + 'ha'并且[1, 2, 3] + ['h', 'a']应该工作.在这些情况下,+=进行就地修改的重载似乎是合理的.
语言设计师决定不[1, 2, 3] + 'ha'应该,因为你混合了不同的类型.这看起来也很合理.
所以问题是为什么他们决定允许混合不同类型的情况x += 'ha'.在这种情况下,我想有几个原因:
x)一般来说,Python试图让你做你想做的事情,但是如果有歧义,它往往会迫使你明确.
小智 5
定义运算符时,有两个不同的"添加"运算符:一个被调用__add__,另一个被调用__iadd__.后者用于就地添加+=,另一个是常规+操作符.http://docs.python.org/reference/datamodel.html上有更多信息.