web-dev-qa-db-ja.com

Pythonでappend()が常にNoneを返すのはなぜですか?

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を学んでいます。この問題が言語固有のものであるかどうか、およびappendがPythonでどのように実装されているかわかりません。

47
Nima Vaziri

appendは、変化する(破壊的な)操作です(新しいリストを返す代わりに、リストをその場で変更します)。 appendの非破壊的な同等物を行う慣用的な方法は

l = [1,2,3]
print l + [4] # [1,2,3,4]
print l # [1,2,3]

あなたの質問に答えるために、私の推測では、appendが新しく変更されたリストを返した場合、ユーザーはそれが非破壊的であると考えるかもしれません。

m = l.append("a")
n = l.append("b")

n[1,2,3,"b"]

50
xuanji

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を返します。

設計と歴史FAQ 推論を与える この設計決定の背後にある(リストに関して):

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

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

Python 2.4に新しい組み込み関数sorted() –が追加されました。この関数は、指定された反復可能オブジェクトから新しいリストを作成し、並べ替えて返します。

16

アドバイスとしては、キーワードや関数を変数名として使用しないようにすることです。上記のコードでは、変数としてリストを使用します。

list = [1, 2, 3]

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

l = [1, 2, 3]
l.append(4)
print l  ## [1, 2, 3, 4]
5
jbiz

何も返しません。変数に追加/追加し、印刷で追加するために使用した最初の変数を使用する必要があることを確認します

friends=["Rajendra V"]
friends.append("John")
print(friends)
0
Rajendra s