MutableとImmutable


ソース-Wikidocsのアップグレード

リストを画像として表示

a = "hello"
b = ["hello","python"]
a文字列オブジェクトをバインドします.
bリストオブジェクトをバインドします.
aとbがバインドされた各オブジェクトのアドレスを出力すると、それらの違いがわかります.
# 변수 a
>>> 2074836971056
# 변수 b
>>> 2074834186368
私はあなたたちが違うことを知っています.では、変数aでバインドされた「hello」文字列オブジェクトとbリストの「0」でバインドされた文字列「hello」は同じオブジェクトですか?
id(a)
>>> 2074836971056
id(b[0])
>>> 2074836971056
id(b)
>>> 2074834186368
id(b[1])
>>> 2074836971440
以上の結果から、aとb[0]は同じオブジェクトであり、リストbとb[1]は異なるオブジェクトであることがわかる.

変数とオブジェクトの関係は、上の画像で表すことができます.

ImmutableとMutable


Pythonでは、オブジェクトに修正可能なタイプもあれば、修正不可能なタイプもあります.変更不可オブジェクトを可変オブジェクト、変更可能オブジェクトをマルチテーブルオブジェクトと呼びます.

可変オブジェクト:int、float、str、tuple


Mutableオブジェクト:list,dict


まず、次のコードを実行して、メモリの変化を理解します.
a = "python2"
id(a)
>>> 2074836971632
a = "python3"
id(a)
>>> 2074836971888
上記のコードは、次の順序で実行されます.
1) 'python2' 문자열 객체가 메모리의 2074836971632 번지에 할당되고 해당 객체를 a라는 변수가 바인딩 함
2) 'python3' 문자열 객체가 메모리의 2074836971888 번지에 할당되고
해당 객체를 a라는 변수가 바인딩 함
3) 'python2' 라는 문자열 객체는 아무도 자신을 참조하지 않기 때문에 가비지 컬렉터에 의해 자동으로 메모리에서 소멸 됨
これは、文字列オブジェクトが変更できないため、「python 2」では文字列「python 3」ではなく、新しいオブジェクトが割り当てられます.バインドpython 2のaは、python 3をバインドすることによって「python 2」の変数をバインドしないため、reference countは0になり、割り当てが解除されます.

今回はリストを修正します.aという名前の変数はリストオブジェクトをバインドします.リストに値を追加すると、リストオブジェクトの先頭アドレス値は変更されません.
a = ['python2','python3']
id(a)
>>> 2074834190080
a.append('python4')
id(a)
>>> 2074834190080

id(a[0])
>>> 2074836971632
id(a[1])
>>> 2074836972208
id(a[2])
>>> 2074836972400
リストオブジェクトには、文字列オブジェクトを再バインドする構造があり、[0]回、[1]回、[2]回がリスト内の要素です.したがって、リストに要素を追加または削除すると、リストオブジェクトの開始アドレスは変更されません.