Pythonのリスト:初心者が動作し、内部実装する方法を知っている必要があります

この記事では、内部リストの操作と実装を掘り下げます。

シンプルな操作

その他のリストを作成し、アクセスするために、管理の点、「追加と削除の一覧」に、我々は理解しようとしています。

ほとんどの場合、あなたはリストを作成し、動的です。あなたのリストを作成した後、要素の追加および削除して、プログラムを実行することをこれが意味。たとえば、あなたが時間をかけて、年齢の要素の対応するメンバーはインクリメントされ、その後、妻と結婚や家庭、これは1が行う追加すべきリストに載っていないされ、家族の年齢のリストを作成しますか?

0x00の、要素を追加

実際のコードでは、要素を追加するための2つの方法の場合があります。

一つは、他のは、リスト内の要素を挿入することで、尾のリストを追加することです。

では、リストの要素の終わりを追加し、我々は()このメソッドを追加使用することができます。

>>> friends=['Mark','Alison','Kobe']
>>> print(friends)
['Mark', 'Alison', 'Kobe']

>>> friends.append('Jordan')
>>> print(friends)
['Mark', 'Alison', 'Kobe', 'Jordan']
>>>

このメソッドはappend()元素の「ジョーダン」は、リスト内の他のすべての要素に影響を与えずに、リストの末尾に追加されます。

実際の開発では、我々は、APPEND()文を追加一連の要素の使用と組み合わせて空のリストを作成することができます。

>>> friends=[]
>>> friends.append('Mark')
>>> friends.append('Alison')
>>> friends.append('Kobe')
>>> print(friends)
['Mark', 'Alison', 'Kobe']
>>>

これは、ユーザデータがプログラムに格納するか知っている、プログラムが実行されていることが多いので、コードの中で最も一般的な方法のリストを作成します。したがって、ユーザーを制御するためには、まず空のリストを作成し、空のリストを追加するユーザデータを提供することができます。

リスト内の要素を挿入し、これを達成するためのPythonの挿入方法があります。あなたは、インデックスと新しい要素の値を指定することができます。

>>> friend=['Mark','Alison']
>>> friend.insert(1,'Kobe')
>>> print(friend)
['Mark', 'Kobe', 'Alison']
>>>

0x01のは、要素のリストを変更します

実際には、同様の構文は、要素と要素のアクセスリストのリストを変更します。唯一の名前と要素のリストにインデックスを指定する必要がある要素を変更します。

>>> friends=['Mark','Alison']
>>> friends[0]='xiyouMc'
>>> print(friends)
['xiyouMc', 'Alison']
>>>

このように、我々は0のインデックス値を変更します。もちろん、あなたが任意の要素を変更することができます。

0x02のリストから要素を削除します

二つの方法で、おそらく、リスト内の要素を削除するには:

一つは、他のポップ方法で、デル・ステートメントを使用することです。

持っているために、 デルの文を最初にあなたは、インデックスの要素を削除する準備を知るために必要なすべての要素のリストを削除するには:

>>>友人= [ 'マーク'、 'アリソン'、 '神戸'] 
>>>デル友人[2] 
>>>プリント(友達)
[ 'マーク'、 'アリソン'] 
>>>

このように、我々は要素2「神戸」のインデックスを削除するためにデルのステートメントを使用しています。

POPは 、この方法では、削除するための2つの方法をサポートしています。データ構造の観点からのPythonのリストでは、それはスタックとして理解することができる、となるポップによってポップ、我々は、スタックの最上位であり得るか、または末尾の要素がポップアップリスト:

>>> friends=['Mark','Alison','Kobe']
>>> friends.pop()
'Kobe'
>>> print(friends)
['Mark', 'Alison']
>>>

私たちは、ポップ要素テールを取得するとき私たちは、見ることができます。あなたはポップ機能はもちろん、使用する要素をリストからの尾のうち、実際に推測することができますので、それは意志も尾の削除要素。

また、削除するインデックスの最初の要素を指定する必要がデル文のようなビットをポップする別の方法:

>>>友人= [ 'マーク'、 'アリソン'、 '神戸'] 
>>> friends.pop(0)
'マーク' 
>>>プリント(友達)
[ 'アリソン'、 '神戸'] 
>>>

コードは、私たちは、ポップアウトの要素0のインデックスを一覧表示し、リストから削除されます。

あなたは必ず削除するには、どの方法でない場合は、実際のコードでは、削除する方法の2種類を要約すると、あなたは、この規格を参照することはできません:あなたはその後、使用、リストから要素を削除し、もはやどのような方法でそれを使用する場合デルの声明;あなたは要素を削除した後、それを使用し続けることができれば、その後、popメソッドを使用します。

このリストの概念および使用はのは、実装の内部リストの理解の深い、より行かせ、終了しています。

新しい技術、新しい言語を学ぶための私の個人的な態度よりも、ここにするために、我々はそれを使用する方法を学習します1ほとんどの場合、新しい言語を学びます。あなたがより良い使用したい場合はしかし、それはより良い言語を使用するためにはその原則をマスターするために、深いその内部実装の原則になければなりません。

の内部リストを達成

それは内部のPythonのリストの実現に来るとき、実際には、それはCPythonのリストを達成することです。今では必ずCが関係している、CPythonのことを言います。

0x00の、データ構造

CPythonのでは実際にはオブジェクトのリストは、データ構造のC言語です。いいえCベースの読者、私は単純にCプログラムでデータの伝送に導入することができる私たちは、より良いコードでデータを処理できるように、この構成では、特定の構造を有します。だから、これはまた、データ構造と呼ばれています。

だから、Pythonのリストデータ構造は、一種どのようにでしょうか?

構造体のtypedef { 
   PyObject_VAR_HEAD 
   PyObject ** ob_item。
   Py_ssize_t型が割り当てられました。
} PyListObject。

要素のリストを指すポインタの配列である、ob_item見ることができる、割り当てられたメモリは、アプリケーション溝の数です。

簡単に言えば、データ構造は、Cプログラム内のオブジェクトのリストです:手段のピン配列要素のリストへのポインタを保存すると、マークは、リスト内のどのように多くの要素を入れることもできます

0x01で、リストの初期化

上述の上方] [あり、初期化リストは、直接パラメータを指定することができる、=を空リストを初期化することができます

だから、CPythonのは、見て、この初期化作用を達成する方法です。

引数:リストのサイズ= 0 
を返す:リストオブジェクト= [] 
PyListNew:
   グローバルPythonオブジェクトのnバイト=サイズ*サイズ= 0は、
   新しいリストオブジェクトを割り当て
   サイズにnbytes = 0のポインタ(ob_item)のリストを割り当てる
   明確なob_item 
   セットリストに割り当てられたVAR 0 = 0のスロットが
   リストオブジェクトを返します

メモリブロックのサイズが0である見ることができる、第一の目的は、ブロックが割り当てられます。この目的は、スロットのメモリ・サイズを与えるために割り当てられます。

以下の下では、リストのデータ構造のメモリスロットの数より上が来る、ここに述べました。この数は、現在のように多くの要素がありますが、リストではありません。要素およびLENの数(リスト)のリストが、実際の要素の数である、同じです。しかしながら、スロットのサイズ分布は、目的の要素がメモリを割り当てる関数を呼び出すたびに追加されないようにするためである要素の数よりも大きくなります。それでは、追加の機能を見てみましょう。

0x02の追加機能

追加機能の下のレビューは、再び、それは要素の機能がリストに追加することができます。

>>>友人= [] 
>>> friends.append( 'マーク')
>>> friends.append( 'アリソン')
>>>プリント(友達)
[ 'マーク'、 'アリソン'] 
>>>

その後はCPythonでの追加機能は、それを実現する方法ですか?

実際には、CPythonの底の関数APP1があり、それは追加の動作にリストを提供することです。l.append(1):たとえば、私たちは整数を追加するためのリストを与えます

 

引数:リストオブジェクト、新しい要素
戻り値:0 OKであれば、-1でない場合
、APP1:
   Nリストの=サイズ
   コールlist_resize()のサイズにリストのサイズを変更するために、N + 1 = 0 + 1 = 1
   リスト[N] =リスト[ 0]新しい要素=
   リターンを0

再設定し、新しいサイズにlist_resize()を呼び出すながらそれは最初、現在のリストのサイズを取得します。何がlist_resize()関数は、そう?

引数:リストオブジェクト、新しいサイズ
戻り値:0であればOK、-1でない場合
list_resize:
   new_allocated =(NewSizeパラメータ>> 3)+(NewSizeパラメータ<9 3:6)= 3 
   new_allocated + = NewSizeパラメータ= 3 + 1 = 4 
   リサイズob_item(ポインタのリスト)サイズnew_allocatedへ
   の復帰0

それは関数の複数の呼び出しを避けるように、我々は、いくつかのメモリを適用することよりなることを見ることができます。溝4の、すなわち合計サイズ、データが第一の位置です。私は、以下のこの手書きの図を見てください:

あなたは、複数の点線でメモリ不足に割り当てられながら、割り当てられている、それが表す、L [0]は私達の新しく追加されたの要素であり、表示されますが、未使用のメモリすることができます。

次に、我々は、(2)、コールlist_resize機能、N + 1 = 2のパラメータが、それは再び4つの空間のために適用されないので、何のアプリケーション記憶されているように追加し続けます。同じ追記(3)及びアペンド(4)は同じです。

0x03の挿入機能

上記の例に基づいて、我々は、新しい要素の挿入位置1のための指標で、このリストを持っています。今回はCPythonのはINS1()関数を呼び出します。

arguments: list object, where, new element
returns: 0 if OK, -1 if not
ins1:
    resize list to size n+1 = 5 -> 4 more slots will be allocated
    starting at the last element up to the offset where, right shift each element 
    set new element at offset where
    return 0

 

破線のブロックは、まだ未使用スペースアプリケーション溝です。今、あなたはすでにスペースの8つのスロットを持っていますが、リストのサイズが5で見ることができます。

0x04の、ポップ操作

そこPythonリストにおいて、ポップ機能がリストの最後の要素を除去して、対応する機能はCPythonのlistpop()関数です。

要素のリストが割り当てられたスペーススロットの半分以下の数を取り出した場合は、この機能ではまだそれは、リストのサイズが小さくなり、list_resize機能、リストのサイズに呼び出します。

arguments: list object
returns: element popped
listpop:
    if list empty:
        return null
    resize list with size 5 - 1 = 4. 4 is not less than 8/2 so no shrinkage
    set list object size to 4
    return last element

4のインデックスが削除されているものの、ポップ関数を呼び出した後、見ることができるが、リストは依然として4つにオブジェクト整数元のインデックス4が、リストのサイズを指しています。

次は、私たちはポップの関数を呼び出します。

再びポップので、要素の数は6に、このリストダウンスロットの半分以下の空間、CPythonのようにスロット空間です。同時に、あなたはまだ元のインデックスがまだメモリ内の元のデータを指している見ることができます。これは手段ポップ、あなたはこのデータを使用し続けることができ、あなたのプログラムを持つこと。

 


 

マスタへのエントリからPythonのリストを作るための方法として記事。それは、addを含め、Pythonのリストの下の操作の始まりの物語、削除、変更します。

後で内部Pythonのリストの実装は、リストを使用している間、リストのより深い説明を行うCPythonとの観点から、説明しなかったと、あなたはとても使用理由を理解する必要があります。

推奨読書:

どのように理解し、Pythonでリストを使用するには

13元記事公開 ウォン称賛78 ビューに45万+を

おすすめ

転載: blog.csdn.net/bluehawksky/article/details/100594846