Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでガベージコレクションはどのように機能しますか?


Pythonは、不要なオブジェクト(組み込み型またはクラスインスタンス)を自動的に削除して、メモリスペースを解放します。 Pythonが定期的に解放し、使用されなくなったメモリのブロックを再利用するプロセスは、ガベージコレクションと呼ばれます。

Pythonのガベージコレクターはプログラムの実行中に実行され、オブジェクトの参照カウントがゼロに達したときにトリガーされます。オブジェクトを指すエイリアスの数が変わると、オブジェクトの参照カウントも変わります。

オブジェクトに新しい名前が割り当てられるか、コンテナ(リスト、タプル、またはディクショナリ)に配置されると、オブジェクトの参照カウントが増加します。オブジェクトの参照カウントは、delで削除されたとき、参照が再割り当てされたとき、または参照がスコープ外になると減少します。オブジェクトの参照カウントがゼロに達すると、Pythonはそれを自動的に収集します。

a = 40      # Create object <40>
b = a       # Increase ref. count  of <40>
c = [b]     # Increase ref. count  of <40>
del a       # Decrease ref. count  of <40>
b = 100     # Decrease ref. count  of <40>
c[0] = -1   # Decrease ref. count  of <40>
のカウント

通常、ガベージコレクターが孤立したインスタンスを破棄し、そのスペースを再利用することに気付くことはありません。ただし、クラスは、インスタンスが破棄されようとしているときに呼び出される、デストラクタと呼ばれる特別なメソッド__del __()を実装できます。このメソッドは、インスタンスによって使用される非メモリリソースをクリーンアップするために使用される場合があります。

この__del__()デストラクタは、破棄されようとしているインスタンスのクラス名を出力します-

#!/usr/bin/python
class Point:
   def __init__( self, x=0, y=0):
      self.x = x       self.y = y    def __del__(self):
      class_name = self.__class__.__name__       print class_name, "destroyed"
 pt1 = Point()
pt2 = pt1 pt3 = pt1
print id(pt1), id(pt2), id(pt3) # prints the ids of the obejcts
del pt1
del pt2
del pt3

出力

上記のコードを実行すると、次の結果が生成されます-

3083401324 3083401324 3083401324
Point destroyed

  1. Pythonファイルでアンダースコア_はどのように機能しますか?

    アンダースコア(_)はPythonでは特別です。 Pythonでアンダースコアを使用する場合は5つあります。 1.インタプリタに最後の式の値を格納するため。 Pythonインタープリターは、最後の式の値を「_」と呼ばれる特別な変数に格納します。 例 >>> 12 + 10 22 >>> _ 22 2.特定の値を無視するため。 アンダースコアは、elixir、erlang、pythonなどのいくつかの言語で特定の値を無視するためにも使用されます。特定の値が不要な場合、または値が使用されていない場合は、値をアンダースコアに割り当ててください。 例 >

  2. mkdir -pはPythonでどのように機能しますか?

    mkdir -pは、親が存在する場合でも再帰的なディレクトリ作成を作成できるようにするために使用されます。ディレクトリを再帰的に作成するには、作成するパスをos.makedirs(path)に指定します。ディレクトリを復元的に作成するには、exists_okをTrueとして指定して、既存のフォルダを許可する必要があります。 >>> import os >>> os.makedirs('my_folder/another/folder', exists_ok=True)