28

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]

この動作はどこかに文書化されていますか?

これをとは対照的list + xに、後者xはもである場合にのみ機能しlistます。これは、ドキュメントで詳しく説明されています。

4

4 に答える 4

18

グイドヴァンロッサムから:

.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;
}

ドキュメントを修正するためにバグレポートを作成しました:http://bugs.python.org/issue16701

于 2012-12-16T19:22:45.047 に答える
5

現在、Python3.4以降およびPython2.7で文書化されています。

4.6.3。可変シーケンスタイプ

次の表の操作は、可変シーケンスタイプで定義されています。ABCは、collections.abc.MutableSequenceカスタムシーケンスタイプでこれらの操作を正しく実装するのを容易にするために提供されています。

[Below] sは、可変シーケンスタイプのインスタンスであり、t任意の反復可能オブジェクトでxあり、によって課せられる任意のタイプと値の制限を満たす任意のオブジェクトですs(たとえば、bytearray値の制限を満たす整数のみを受け入れます0 <= x <= 255)。


s.extend(t)またs += t

(のほとんどはと同じ)sの内容で拡張されますts[len(s):len(s)] = t

したがって、可変シーケンスタイプのs場合、はとs += t同義であることが文書化されていs.extend(t)ます。

于 2017-01-01T18:29:44.420 に答える
4

いいえ(Guidoは確認します; Ashwini Chaudharyに感謝します)。+=一般に、forシーケンスの動作は十分に指定されていません。x + ywherexがリストでありy、他の反復可能なものがエラーである(他の実装がそれを許可することを選択できる)ことは仕様によって要求されておらず、他の実装は+=同種のオペランドを要求するように制限できると結論付けます。

ただし、これを行わない理由は明らかです。Pythonは一般に、厳密な型の同等性を要求するのではなく、オペランドを使用して正しいことを行おうとします。本当の謎は、リストで異種の追加が許可されない理由です。

itertools.chain更新:主に問題のほぼ完全な解決策であるため、不均一な加算の問題について実際に考えたことはありません。

Pythonの内部に精通している人からのコメントは、追加が同種である必要がある理由を説明するために歓迎されています。(ここでの質問:Pythonリストの追加が同種でなければならないのはなぜですか?

于 2012-12-16T19:51:04.130 に答える
-1

そこにいるパフォーマンスフリークにとって、はい、+=は:よりも少し速いですextend

>>> from timeit import repeat
>>> min(repeat('a.extend((1,2,3,4,5,6,7))', 'a=[]'))
0.23489440699995612
>>> min(repeat('e((1,2,3,4,5,6,7))', 'a=[]; e = a.extend'))
0.2214308570000867
>>> min(repeat('a+=(1,2,3,4,5,6,7)', 'a=[]'))
0.21909333300027356

そして、これはそれがどのように比較されるかappendです:

>>> min(repeat('a.append(1)', 'a=[]'))
0.062107428999297554
>>> min(repeat('p(1)', 'a=[]; p = a.append'))
0.04968810399986978
>>> min(repeat('a+=(1,)', 'a=[]'))
0.0501599309991434

(Python 3.7 64ビット、Windowsでのテスト)

于 2018-07-24T11:14:01.743 に答える