浅い放射と深い放射


浅い放射


浅いレプリケーション


浅いコピー変数は同じアドレスを指します.
a = [1, 2, 3]
b = a # a와 같은 주소를 가리킨다
aの要素を変更すると、bも同じ変更値を有します.
aの特定の要素を変更すると、aが指すアドレスの変更は起こらないからである.
a[1] = 100
print(b) # b와 a는 여전히 같은 주소를 가리킨다

>>> [1, 100, 3]

ディープコピー(deepcopy)


複製された変数は、同じ値を持つ新しいオブジェクトのアドレスです.
import copy
a = [1, 2, 3]
b = copy.deepcopy(a) # 새로운 [1, 2, 3] 주소를 가리킨다
(参照)https://thrillfighter.tistory.com/272

整理する


bがaをどのようにコピーしても、bが指すアドレスは変わりません。


コピーから、aが指す(aの矢印)とbが指す(bの矢印)は別です.
aが指すアドレスが変更されても、bはaの最初のコピー時のアドレスを指し続ける.

数値


浅い放射
ただし、aの値を変更すると、aは新しいアドレスを指します.
数字は変わらないオブジェクトだからです.
bの指すアドレスと値は変更されません.
print("*** 숫자 ***")
a = 5
b = a
print(id(5))
print(a, id(a)) # 5 2061182527920
print(b, id(b)) # 5 2061182527920 (a와 같은 주소)
print()

a = 6
print(a, id(a)) # 6 2061182527952 (a의 주소 바뀜)
print(b, id(b)) # 5 2061182527920 (주소 그대로임. 안바뀜)
print()

文字列


浅い放射
ただし、aの値を変更すると、aは新しいアドレスを指します.
文字列は数字と同じように不変のオブジェクトであるためです.
bの指すアドレスと値は変更されません.
print("*** 문자열 ***")
a = "hello"
b = a
print(a, id(a)) # hello 2207970515376
print(b, id(b)) # hello 2207970515376 (a와 같은 주소)
print()

a = "hi"
print(a, id(a)) # hi 2061182527952 (a의 주소 바뀜)
print(b, id(b)) # hello 2207970515376 (주소 그대로임. 안바뀜)
print()

インベントリ


浅い放射、特定の要素の変更


浅いコピーaのbはaと同じアドレスを指す.
aを変更する特定の要素は、aが指すアドレスを変更するものではない.
アドレスはそのままで、内容のみを上書きします.
したがって,アドレスが変わらないbもaによって内容物が変化する.
print("*** 리스트 ***")
print("얕은 복사한 b는 a의 특정 원소를 변경하는 경우, b도 바뀐다")
a = [1,2,3]
b = a
print(a, id(a)) # [1, 2, 3] 2061184491840
print(b, id(b)) # [1, 2, 3] 2061184491840 (a와 같은 주소)
print()

a[1] = 100
print(a, id(a)) # [1, 100, 3] 2061184491840 (주소 그대로, 값만 바뀜)
print(b, id(b)) # [1, 100, 3] 2061184491840 (주소 그대로, a따라 값 바뀜)
print()

ふかほうしゃ


bは、aと同じ値を有する新しいオブジェクトのアドレスを有する.
aの特定の要素を変更すると、アドレスが異なるため、bは影響を受けません.
すなわち,bの内容物は同じである.
print("깊은 복사한 b는, a와 똑같은 값을 가지는 새로운 리스트의 주소를 가리킨다")
import copy
a = [1,2,3]
b = copy.deepcopy(a)
a[1] = 100
print(a, id(a)) # [1, 100, 3] 1973455816576
print(b, id(b)) # [1, 2, 3] 1973455752128
print()

新規リストの作成


新しいリストを作成すると、新しいリストのアドレスが表示されます.
b浅い複製aの場合、aと同じアドレスを指す.
しかし、aが新しいリストを指すアドレスに変更されると、bはaの影響を受けない.
print("a가 아예 다른 리스트를 가리키는 경우, b는 그대로다")
a = [4, 5, 6]
b = a
print(a, id(a)) # [4, 5, 6] 2412914002624
print(b, id(b)) # [4, 5, 6] 2412914002624 (a와 같은 주소)
print()

a = [7, 8, 9]
print(a, id(a)) # [7, 8, 9] 2412913713472 (a의 주소 바뀜)
print(b, id(b)) # [4, 5, 6] 2412914002624 (주소 그대로임. 안바뀜)
print()

カスタムクラスとオブジェクト


接続リスト要素の挿入


ターゲット:1→2→3人接続リストheadを作成する
変数の使用
  • fixed:アドレスを指す不変の変数
  • ptr:新規ノードアドレスを示す変数
  • head:最終接続リスト
  • fixed = ptr = ListNode()
    for item in [1,2,3]:
    	ptr.next = ListNode(item)
    	ptr = ptr.next
    
    head = fixed.next
    print(head)

    新規ノードの作成
    fixedとptrはそれぞれ同じアドレスを指す.

    for文:itemが1の場合
    ptr.nextとは、新しいノードを指します.

    ptrは作成したばかりのノードを指します.
    fixedが指すアドレスは初めてです.ptrが指すアドレスは変更とは異なる.

    for文:itemが2の場合


    for文:itemが3の場合




    print()で確認する

    fixed = ptr = ListNode()
    print(id(fixed), "fixed", fixed)
    print(id(ptr), "ptr", ptr)
    print()
    
    for item in [1,2,3]:
    	ptr.next = ListNode(item)
    	print(id(ptr.next), "ptr.next", ptr.next)
    	print(id(fixed.next), "fixed.next", fixed.next)
    	print(id(fixed), "fixed", fixed)
    	
    	ptr = ptr.next
    	print(id(ptr), "ptr", ptr)
    	print(id(fixed), "fixed", fixed)
    	
    	print()
    
    head = fixed.next
    print(head)


    間違った内容があれば、いつでもお知らせください.