80
list = [1, 2, 3]
print(list.append(4))   ## WRONG, print does not work, append() returns None

## RIGHT:
list.append(4)
print(list)  ## [1, 2, 3, 4]

私は Python を学んでいますが、この問題が言語に固有のものであるかどうか、およびappendPython でどのように実装されているかはわかりません。

4

5 に答える 5

25

シーケンスを変更するメソッドが を返すのは、Python の慣習ですNone

検討:

>>> a_list = [3, 2, 1]
>>> print a_list.sort()
None
>>> a_list
[1, 2, 3]

>>> a_dict = {}
>>> print a_dict.__setitem__('a', 1)
None
>>> a_dict
{'a': 1}

>>> a_set = set()
>>> print a_set.add(1)
None
>>> a_set
set([1])

Python 3.3 から、これはより明確に文書化されました:

一部のコレクション クラスは可変です。メンバーをその場で追加、削除、または再配置し、特定のアイテムを返さないメソッドは、コレクション インスタンス自体を返すことはありませんが、None.

Design and History FAQは、 (リストに関して) この設計上の決定の背後にある理由を示しています:

list.sort() がソートされたリストを返さないのはなぜですか?

パフォーマンスが重要な状況では、並べ替えるためだけにリストのコピーを作成するのは無駄です。したがって、list.sort()リストをその場でソートします。その事実を思い出させるために、ソートされたリストを返しません。このようにして、並べ替えられたコピーが必要であるが、並べ替えられていないバージョンを維持する必要がある場合に、誤ってリストを上書きすることにだまされることはありません。

Python 2.4 では、新しい組み込み関数 – sorted()– が追加されました。この関数は、提供された iterable から新しいリストを作成し、それをソートして返します。

于 2013-09-16T13:26:48.987 に答える
5

1 つのアドバイスは、キーワードや関数を変数名として使用しないことです。上記のコードでは、list を変数として使用します。

list = [1, 2, 3]

リストは実際には組み込み型として既に定義されているlistため、変数名として使用しないことをお勧めします。ChaseTheSun と squiguy が指摘したように、それ以上のことはありません。

lst = [1, 2, 3]
lst.append(4)
print(lst)  ## [1, 2, 3, 4]
于 2013-05-20T01:17:19.207 に答える