リスト内の要素とコピー


リファレンス
Do it! データ構造とともに学ぶアルゴリズム入門(Python編)
コミュニケーション可能とコミュニケーション可能の代入
整数を表すint型と文字列を表すstr型では値を変更できません.このような値を変更できない特性を移動可能と呼び、変更可能な値の特性を移動可能と呼ぶ.
インタラクティブ:list、set、dictionary
このインタラクティブなデータ型:数値、文字列、凡例
配列はオブジェクトを格納し、配列に格納された各オブジェクトは要素と呼ばれます.
各要素にはインデックスが付与されます.
Pythonでは、要素を並べた資料型は何でも構いません.
Pythonでは、変数はオブジェクトに関連付けられた名前にすぎません.したがって,リスト,チュートリアルの要素資料タイプを予め決定する必要はない.次のプログラムで確認してみましょう.
# 자료형을 정하지 않은 리스트 원소 확인하기

x = [15, 64, 7, 3.14, [32, 55], 'ABC']
for i in range(len(x)):
    print(f'x[{i}] = {x[i]}')
x[0] = 15
x[1] = 64
x[2] = 7
x[3] = 3.14
x[4] = [32, 55]
x[5] = ABC

図はxを配列する形状である.
各要素x[0]、x[1]、x[2]、x[3]、x[4]、x[5]は、int型、int型、float型、list型、str型のオブジェクトを参照する名前である.
Pythonでは、リスト内の各要素のデータ型が異なる場合があります.
リストをコピーするときに使用するcopy()関数は注意して使用する必要があります.リストをコピーして丸み値を変更すると、コピーした丸み値に変更されます.
>>> a = [[1, 2], [3, 4]]
>>> b = a.copy()
>>> a is b
False
>>> a == b
True
>>> id(a)
2202101300032
>>> id(b)
2202101302336
>>> a[1].append(5)
>>> a
[[1, 2], [3, 4, 5]]
>>> b
[[1, 2], [3, 4, 5]]
>>> id(a)
2202101300032
>>> id(b)
2202101302336
>>> a[0][1] = 9
>>> a
[[1, 9], [3, 4, 5]]
>>> b
[[1, 9], [3, 4, 5]]
>>> x = [[1, 2, 3], [4, 5, 6]]
>>> y = x.copy()  # x를 y로 얕은 복사
>>> x[0][1] = 9
>>> x
[[1, 9, 3], [4, 5, 6]]
>>> y
[[1, 9, 3], [4, 5, 6]]
copyを使用してリストyをコピーし、x[0][1]の値を9に更新すると、y[0][1]の値が9に更新されます.これは、リストの浅いコピー(浅いコピー)を実行するためです.[浅いコピー]では、リスト内のすべての要素が参照する場所にコピーされます.コピーされた要素はすべてx[0]とx[1]です.x[0]とy[0]が参照する箇所は同じであるため、x[0][1]とy[0][1]が参照する箇所も同じである.すなわち,リストxが参照する箇所が異なるとyも異なる.このような状況を回避するには、デプスコピー(deepcopy)と呼ばれるコンポーネントレベルにコピーする方法が必要です.深度レプリケーションは、copyモジュールのdeepcopy()関数によって実行されます.
>>> import copy  # deepcopy를 사용하기 위해 copy 모듈 임포트
>>> x = [[1, 2, 3], [4, 5, 6]]
>>> y = copy.deepcopy(x)  # x를 y로 깊은 복사
>>> x[0][1] = 9
>>> x
[[1, 9, 3], [4, 5, 6]]  # 대입된 9가 출력됨
>>> y
[[1, 2, 3], [4, 5, 6]]  # y 배열은 영향을 받지 않음
リスト内の要素だけでなく、コンポーネント(要素内の要素)もコピーします.したがって、x[0][1]に9を代入すると、x[0][1]参照の位置が2から9に更新される.したがって、y[0][1]参照の位置は更新されない.

✓浅い放射と深い放射
オブジェクトのメンバー値を新しいオブジェクトにコピーする場合、オブジェクトにリファレンスタイプのメンバーが含まれている場合は、「浅いコピー」と呼ばれます.これは、リファレンス値のみをコピーする方法です.深度コピーは、参照値だけでなく、参照されたオブジェクト自体もコピーします.つまり、オブジェクトが持つすべてのメンバー(値と参照形式はすべて)がコピーされるため、フルコピーとも呼ばれます.
✓浅いコピー(浅いコピー)
リストにリスト(可変オブジェクトの可変オブジェクト)がある場合は、問題が発生します.
再配分の場合は問題ありません.メモリアドレスも変更されます.
>>> x = [[1, 2, 3], [4, 5, 6]]
>>> y = x.copy()
>>> id(x)
2202101387712
>>> id(y)
2202101300096
>>> id(x[0])
2202101464576
>>> id(y[0])
2202101464576
>>> x[0] = [7, 8, 9]    # 재할당
>>> x
[[7, 8, 9], [4, 5, 6]]
>>> y
[[1, 2, 3], [4, 5, 6]]
>>> id(x[0])
2202101464320
>>> id(y[0])
2202101464576
>>> x[0][1] = 4
>>> x
[[7, 4, 9], [4, 5, 6]]
>>> y
[[1, 2, 3], [4, 5, 6]]