Python列表+ = iterable的行为是否记录在任何地方?

NPE*_*NPE 28 python containers operators

看起来在Python中,list += x适用于任何可迭代的x:

In [6]: l = []

In [7]: l += [1]

In [8]: l += (2, 3)

In [9]: l += xrange(5)

In [10]: l
Out[10]: [1, 2, 3, 0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

这种行为记录在哪里吗?

为了与之形成对比list + x,后者只有在x同样的情况下才有效list.这在文档中有详细说明.

Ash*_*ary 18

来自Guido van Rossum:

它的工作方式与.extend()它返回的方式相同self.我找不到解释这个问题的文档.:-(

以下是相关的源代码listobject.c:

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;
}
Run Code Online (Sandbox Code Playgroud)

我已经提出了一个错误报告来修复文档:http://bugs.python.org/issue16701

  • @delnan如果文档中实际上缺少这个东西怎么办,那么docs也会有bug. (3认同)
  • 该问题要求*文档*此行为.源代码不是文档,并且PEP没有(据我所知,从略读和grepping)为列表定义`+ =`的语义,只定义了回退行为(列出覆盖).我错过了什么,或者你实际上没有回答这个问题?-1现在. (2认同)
  • @downvoters也很友好地解释你的downvotes. (2认同)

Ant*_*ala 5

现在记录在 Python 3.4+ 和 Python 2.7 中:

4.6.3. 可变序列类型

下表中的操作是在可变序列类型上定义的。在collections.abc.MutableSequence美国广播公司提供,使其更容易正确地执行自定义序列类型这些操作。

[Below] s是可变序列类型的实例,t是任何可迭代对象,并且x是满足由 强加的任何类型和值限制的任意对象s(例如,bytearray只接受满足值限制的整数0 <= x <= 255)。


s.extend(t) 或者 s += t

扩展s内容t (在大多数情况下与s[len(s):len(s)] = t

因此,现在有记录表明,对于任何可变序列类型ss += ts.extend(t).