2013-05-20 20 views
24
list = [1, 2, 3] 
print list.append(4) ## NO, does not work, append() returns None 
## Correct pattern: 
list.append(4) 
print list ## [1, 2, 3, 4] 

私は、Pythonを学んだし、私はこの問題は、言語に固有のもので、どのように追加し、Pythonで実装されているかはわかりません。アドバイスのこのコードでappendがnoneを返すのはなぜですか?

+3

最初のインスタンスでは、追加操作の結果を出力します。 append()が正常に終了した場合は、問題が発生した場合のように 'None'が返されます。なし – ChaseTheSun

+5

'append'は働いていれば' None'を返します。それ以上のことはありません。 – squiguy

+0

ああ元のコードのコメントが 'append'が' void'関数だと言っていたら、(少なくとも私にとっては)理解しやすいでしょう。これは感謝します、ありがとう。 –

答えて

29

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") 

のようなコードを書いて、それはシーケンスを変異させる方法はを返すことをPythonで慣例であるn[1,2,3,"b"]

3

一つの単語は変数名としてキーワードや関数の使用を避けることであろう。上記のコードでは、変数としてリストを使用します。

list = [1, 2, 3] 

私は実際にはすでに組み込み型として定義されてlistとして変数名としてlistを使用しないことをお勧めします。 ChaseTheSunとsquiguyが指摘したように、はるかにそれに続い

l = [1, 2, 3] 
l.append(4) 
print l ## [1, 2, 3, 4] 
+0

それを指摘してくれてありがとうと私はその練習をよく知っています。他のソースからコードをコピーして貼り付けただけです。 –

7

であることを期待するかもしれません。

を考えてみましょう:

>>> 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以降では、これは今 explicitly documented以上である:

いくつかのコレクションクラスは変更可能です。 、 を引くかの場所でそのメンバーを並べ替え、追加、および特定の項目を返さないメソッドは、コレクションのインスタンス自体が、Noneを返すことはありません 。 (リストに関して)

設計し、この設計上の決定の背後にある歴史ある質問gives the reasoning

はなぜソートされたリストを返しませlist.sort()ん?

パフォーマンスの問題が発生した場合は、リストのコピーを並べ替えるだけで無駄になります。したがって、list.sort()は、 リストを所定の場所にソートします。その事実を思い出させるために、ソートされたリスト を返しません。このように、あなたは、あなたがソートされたコピーが必要でなく、 に周りにソートされていないバージョンを保持する必要がある場合に、誤って リストを上書きして、だまされてはいけません。 Pythonの2.4の新しい組み込み関数で

- sorted()は - 追加されました。 この関数はそれを をソートし、提供のiterableから新しいリストを作成し、それを返します。

関連する問題