python転送問題とメモリ管理メカニズムを深く詳しく理解する


                         python      :

pythonではいったい「伝引用」なのか「伝値」なのか??
この質問の答えは、状況を見ることです.あるのは伝値で、あるのは伝引用です.
判断の根拠は対象の可変性を見ることであり,この点は対象のタイプに依存する.したがってpythonでは、オブジェクトが可変なのか可変ではないのかを説明します.
基本データ型(整数およびその他のデータ型、文字列)およびメタグループは可変ではありません.パラメータはパラメータを伝達します.つまり、元の値のコピーが伝達されます.関数でパラメータを変更しても実パラメータは変化しません.
       def func(a)
リスト、辞書、クラスおよびクラスインスタンスは可変データ型であり、パラメータ伝達としては元の値の参照であり、関数はパラメータリストを変更し、実パラメータもそれに応じて変化する.
       def func(a=[])
メタグループは変更が許されないため、メタグループを用いるパラメータ伝達を行うことができる.
 
よく使われる例はlistです.sort()は、リスト上で直接ソートされ、返すのではなく、自分でコピーすることができます:newlist=list(mylist)、またはnewlist=mylist[:]
 
pythonでオブジェクト(a=b)をコピーするのも同様で、可変オブジェクトは本当にコピーされ、可変オブジェクトはその参照をコピーしただけです.
例1:
list0=[1,2,’a’,[‘b’,’c’]]
list1= list0
list1[0]=11
list0[3][0]= ’d’
print list1 #[ 11,2,’a’,[‘d’,’c’] ]
print list0 #[ 11,2,’a’,[‘d’,’c’] ]
List 0では1,2,’a’はいずれも可変オブジェクトであり,[‘b’,’c’]は可変オブジェクトである.
例2:(浅いコピー)
list0=[1,2,’a’,[‘b’,’c’]]
list1=list(list0)
list1[0]=11
list0[3][0]= ’d’
print list1 #[ 11,2,’a’,[‘d’,’c’] ]
print list0 #[ 1 ,2,’a’,[‘d’,’c’] ]
List 0では1,2,’a’はいずれも可変オブジェクトであり,[‘b’,’c’]は可変オブジェクトである.
上の説明を経て、私たちはすでにどれが引用なのか、どれが伝値なのかを初歩的に認識しているかもしれません.これで、私たちはまだその内部原理を本当に理解していません.

>>a=1
>>b=a
id(a)=id(b)で、bとaは同じアドレスを指し、bもaへの参照である
bの値が変更されると、他のアドレス、すなわちメモリの再割り当てを指す
>>b+=1
id(a)!=id(b)
>>a=[1,2,3]
>>b=a
このときbはaの参照である.id(a)==id(b)
>>b=[4,5,6]
このときbはメモリを再割り当てする.
もう1つの説明:定義した変数が関数と同じ名前の場合、システム関数を使用するとpythonは使用できないとプロンプトされます.del varibleで変数を削除します.
例:>>>list=[1,2,3]
>>>>newlist=list(list)#この場合、外のlistもリストとして使用されてエラーが発生します
>>>del list
原理:
python         ,             。          ,                    ,                      。

pythonの任意の変数はオブジェクトであり、可変に見えるオブジェクトは値伝達であり、伝達の参照でもある.パラメータを変更した後、パラメータと実パラメータが一致しなかったのは、可変オブジェクトの変更が再割り当て(すなわちメモリを再割り当てするプロセス)であり、可変オブジェクトの変更値は元のメモリアドレスに基づいてaddまたはappendであるためである.再付与のプロセスではありません.上記の例では、可変オブジェクト再付与アドレスも同様に変化することがわかります.
さらにpythonのメモリ管理メカニズムを解読します.
Pythonは、参照カウントというメカニズムを導入しました.python内部では参照カウントを使用して追跡メモリ内のオブジェクトを保持し、Python内部ではオブジェクトの参照数、すなわち参照カウントが何個記録され、オブジェクトが作成されると参照カウントが作成され、オブジェクトが不要になった場合、このオブジェクトの参照カウントが0の場合、ゴミ回収されます.
オブジェクトをまとめると、次の場合に参照カウントに1が加算されます.
1.オブジェクトが作成されました:x=4
2.他の人が作成される:y=x
3.パラメータとして関数に渡される:foo(x)
4.コンテナオブジェクトとしての要素:a=[1,x,'33']
参照数の減少
1.ローカル参照がその役割ドメインから離れています.たとえば,上のfoo(x)関数が終了すると,xが指すオブジェクト参照は1減少する.
2.オブジェクトの別名が明示的に破棄される:del x;またはdel y
3.オブジェクトの別名が他のオブジェクトに割り当てられます:x=789
4.オブジェクトをウィンドウオブジェクトから削除する:myList.remove(x)
5.ウィンドウオブジェクト自体が破棄される:del myList、またはウィンドウオブジェクト自体が役割ドメインから離れている.
ごみ回収
1、メモリに使用されなくなった部分があると、ゴミ収集器が掃除します.リファレンス数が0のオブジェクトをチェックし、メモリの領域をクリアします.もちろん、参照カウントが0の場合だけでなく、2つのオブジェクトが相互に参照されている場合、それら自体の他の参照が0になっている場合もあります.2、ゴミ回収の仕組みもう一つ
ごみ回収器を循環して、循環参照オブジェクト(a参照b、b参照a、その参照カウントが永遠に0でないことを保証します).
Pythonでは、多くの場合、申請されたメモリは小さなブロックのメモリであり、これらの小さなブロックに申請が存在すると、すぐに解放されます.これらのメモリの申請はオブジェクトを作成するためではないため、オブジェクトの1級メモリプールメカニズムはありません.これは、Pythonが実行中にmallocとfreeの操作を大量に実行し、ユーザ状態とコア状態を頻繁に切り替えることを意味し、Pythonの実行効率に深刻な影響を及ぼす.Pythonの実行効率を向上させるため、Pythonはメモリプールメカニズムを導入し、小さなメモリの申請と解放を管理しています.
メモリプールメカニズム
Pythonはメモリのゴミ収集メカニズムを提供していますが、オペレーティングシステムに戻るのではなく、不要なメモリをメモリプールに保存します.
Pythonの256バイト未満のすべてのオブジェクトはpymallocで実装されたディスペンサを使用し、大きなオブジェクトはシステムのmallocを使用します.また、Pythonオブジェクト、例えば整数、浮動小数点数、リストには、独立したプライベートメモリプールがあり、オブジェクト間でメモリプールを共有しません.つまり、割り当てが大量の整数を解放した場合、これらの整数をキャッシュするメモリは浮動小数点数に割り当てられません.
Pythonでは、多くの場合、申請されたメモリは小さなブロックのメモリであり、これらの小さなブロックに申請が存在すると、すぐに解放されます.これらのメモリの申請はオブジェクトを作成するためではないため、オブジェクトの1級メモリプールメカニズムはありません.これは、Pythonが実行中にmallocとfreeの操作を大量に実行し、ユーザ状態とコア状態を頻繁に切り替えることを意味し、Pythonの実行効率に深刻な影響を及ぼす.Pythonの実行効率を向上させるため、Pythonはメモリプールメカニズムを導入し、小さなメモリの申請と解放を管理しています.これが前述したPymallocメカニズムである. 
メモリ管理メカニズムの参照:http://blog.chinaunix.net/uid-26602509-id-3506965.html
次にpythonメモリについてお話しし、面接中に
pythonのlistはメモリに配列で格納されますか?それともチェーンテーブルで格納されますか??
いきなり聞かれて、考えてみるとチェーンテーブルだと思っていたが、その後は配列だと思っていた.あいまいだった.いくつかの資料を調べると、リストの格納方法はarraylist(ダイナミック配列)で、それに対応するのはlinkedlist(チェーンテーブル)で、arraylistは実は配列で、実はC++のvectorに相当する.ただし、この場合のlistは異なるタイプの要素を格納することができます.では、これらを理解してから、頻繁に挿入したり削除したりする場合、listの効率は低いことに注意します.結局、arraylistのストレージ形式です.
pythonのtupleストレージ形式は何ですか?
tupleのメモリにおける格納形式は定数配列であり,可変のデータ型であるため,定数配列推定は誰もが理解できる.
pythonのdictionaryストレージ形式は何ですか?
辞書はC++標準ライブラリのmapに相当します.
文字列は?
文字列は実は修正できないlistであり、配列の形式でもあり、これはc/c++と一致している.