2009-03-25 18 views
7

ないようでは、Pythonのリストの最後の要素をしたいと言う:list [-1:] [0]とlist [len(list)-1]の違いは何ですか?

myList[-1:][0] 

myList[len(myList)-1] 

の違いは何である私は差はなかったと思ったが、その後、私はこの

>>> list = [0] 
>>> list[-1:][0] 
0 
>>> list[-1:][0] += 1 
>>> list 
[0] 
>>> list[len(list)-1] += 1 
>>> list 
[1] 
を試してみました

私はちょっとびっくりしました...

+1

と同等です[0]';それを書く普通の方法はちょうど 'list [-1]'です。また、リスト 'list'の名前をつけて、組み込みの' list() 'をシャドーイングするのを避けたいでしょう。 – kquinn

答えて

14

スライシング[-1:]の場合、返されるリストは参照ではなくシャローコピーです。 so [-1:] [0]は新しいリストを変更します。 [len(list)-1]は最後のオブジェクトへの参照です。

9

list[-1:]は新しいリストを作成します。 list[len(list)-1]と同じ動作を取得するためには、listのいくつかの種類のビューを返しなければならないでしょうが、私が言ったように、それは新しい一時的なリストを作成します。その後、一時的なリストを編集します。

とにかく、同じことをlist[-1]とすることができます。

+0

右...あの...私はそれを知っていた... – c0m4

3

スライスは、コピー(シャローコピー)を作成します。それはしばしば浅いコピーのイディオムとして使用されます。 [-1:]すなわち

list2 = list1[:] 

あなたは `リストを書いている理由はわからない

import copy 
list2 = copy.copy(list1) 
+0

を...それは「頻繁に使用さ」だ理由があるのコピーを使用するよりも理解しやすい/読みにくく思われますか? – tgray

+0

読みにくいと私は同意します。それはなぜ使用されていますか?私はそれがインポートを必要としないためだと思います。 – vartec

+0

は、あなたはそれがコードの別の行がかかるため、彼らは輸入を避けていると思いますか、または彼らはオーバーヘッドのいくつかの並べ替え(メモリ、ロード時間など)を避けるためにしようとしているので? – tgray

関連する問題