Pythonの変数とガベージコレクションメカニズム

1.Pythonの変数

pythonそしてjava、の変数は本質的に異なります。

java変数で変数を宣言するときは、変数のデータ型、int、str、または特定の型を指定する必要があります。そうすると、仮想マシンはメモリ内のスペースを適用します。スペースのサイズはタイプに関連しています。 。一般的な理解は、変数をボックスとして想像することであり、ボックスに含めることができるものは最初に設定されます。

たとえばa=1、ボックスに1を入力します。

python変数は基本的にポインターであり、ポインターのサイズは同じです。たとえば、int型へのポインタ、ポインタ自体のサイズは固定されており、int自体が占めるメモリサイズを考慮する必要はありませんが、とにかくメモリに配置されます。intオブジェクトにアクセスするときにのみポインタを見つける必要があります。

テイクa=11を格納するためのスペース、そして、1ポイントを開くために、第1のメモリにint型のオブジェクトを宣言するために、。

a = [1,2,3]
b = a
b.append(4)
print(a) # [1,2,3,4]

ボックスのアイデアを使用してここを理解する場合:リストを[1,2,3]1つのボックスに入れ、aを別のボックスに入れると、bを変更した後にaを印刷しても、aは変更されません。

a = [1,2,3]
b = a
print(a is b) # True

isまたことが分かるa和がbされているのと同じオブジェクトであるaidの値b尖った物体がid同じであるの値尖った物体

2。==との違いは

  • です

最後に、a = [1,2,3] b = aaとbは同じオブジェクトだと言いました。では、2つの割り当ての場合はどうなるでしょうか。

a = [1,2,3]
b = [1,2,3]
ptint(a is b) # False
print(id(a) == id(b)) #False

結果から、この時点でのaとbは異なるオブジェクトです。つまり、代入ステートメントを使用すると、オブジェクトが再宣言されます。

次のような特別な場合があります

a = 1
b = 1
print(a is b) #True

python内部internメカニズム-特定の範囲内で同じ小さな整数に遭遇した場合、新しいオブジェクトは生成されず、元のオブジェクトを直接指します。内部最適化メカニズム。

同じことが小さな文字列にも当てはまります。

a = "abc"
b = "abc"
print(a is b) #True

使用はクラスを判断することです

class People:
    pass
person = People()
# isinstance(person,People)
if type(person) is People:
    print('Yes') # Yes

クラス自体はオブジェクトであり、オブジェクトがグローバルに一意であるためpersonに実際ポイントPeopleので、type(person)及びPeopleIDが同じです。

  • ==
a = [1,2,3]
b = [1,2,3]
ptint(a == b) # True

aはlist型のオブジェクトです。魔法の関数はlistに実装されています__eq__。==に遭遇すると、この関数を呼び出して、オブジェクトの値が等しいかどうかを判断します。

3.delステートメントとガベージコレクションメカニズム

pythonのガベージコレクションアルゴリズムは、参照カウントを使用しています。

最初の定義a=1b=aおよびその後1が自動的にこのオブジェクトのカウンタを生成し、a=1時間カウンタは、1だけ増加するb=aBもを指すことを示す。このとき、1だけカウンタが増加し、二つの変数と1と同等ですそれを指しています。

del aオブジェクト削除すると、カウンターが1つ減ります。カウンターが0に減少すると、Pythonインタープリターはオブジェクトを再利用します(常にメモリ内で占有することはできません)。

C ++のdeleteステートメントは、Pythonとは異なり、オブジェクトを直接再利用するためのものです。

栗をあげる

a=object()
b=a
del a
print(b) # object object at 0x0000000003D90F0
print(a) # name a is not defined

上記の結果は、bは印刷できますが、aは印刷できないということです。このプロセスでは、オブジェクトaを削除し、参照カウンターを1デクリメントします。

ときpythonインタプリタは、オブジェクトを再利用し、それは、オブジェクトの呼び出します__del__魔法の機能を。したがって、ガベージコレクションを行う場合、オブジェクトがリサイクルされるときに特定のリソースが解放されることを期待してい__del__ます。これは、関数のオーバーロードによって実現できます

class A:
	def __del__(self):
		pass

4.受信リストに関する注意事項

最初のケース

def add(a,b):
    a+=b
    return a
if __name__ == "__main__":
    a = 1
    b = 2
    c=add(a,b)
    print(c) # 3
    print(a,b) # 1 2

2番目のケース

def add(a,b):
    a+=b
    return a
if __name__ == "__main__":
    a = [1,2]
    b = [3,4]
    c=add(a,b)
    print(c) # [1,2,3,4]
    print(a,b) # [1,2,3,4] [3,4]

この時点で、リストは変数タイプであり、操作中に+ =記号が元のリスト変数aに直接割り当てられているため、入力aが変更されていることがわかります。したがって、元のaが変更されています。

3番目のケース

def add(a,b):
    a+=b
    return a
if __name__ == "__main__":
    a = (1,2)
    b = (3,4)
    c=add(a,b)
    print(c) # (1,2,3,4)
    print(a,b) # (1,2) (3,4)

総括する

3つの異なるタイプのパラメーターが渡されると、リストオブジェクトのみが元のデータに影響を与えます。

そのため、オブジェクトを関数に渡すときに、オブジェクトがlist、dict値を変更できる型である場合、元のデータが変更される可能性があります。

おすすめ

転載: blog.csdn.net/weixin_43901214/article/details/107039987