Python 기반 할당, 얕은 복제, 깊은 복제의 차이

부치


새 메모리 공간을 열지 않고 새 대상의 인용만 복사합니다.그래서 한 데이터가 변화할 때 다른 데이터도 이에 따라 바뀐다.

2. 얕은 복사


원본 객체에 대한 참조를 포함하는 새 객체를 작성합니다.얕은 복사본을 얕은 복사본이라고 하는 이유는 1층, 즉 가장 바깥쪽의 대상 자체만 복사하고 내부의 요소는 모두 하나의 인용만 복사했기 때문이다. 즉, 내부 요소가 수정되면 다른 데이터도 변화한다.
간단한 복제본의 세 가지 형태:

A = [1, 2, 3, 4]
  • 슬라이스 조작
  • 
    #  1 
    B = A[:]
    #  2 
    B = [a for a in A]
  • 공장 함수
  • 
    B = list(A)
  • copy 함수
  • 
    B = copy.copy(A)
    얕은 복제본은 다음과 같은 두 가지 시나리오로 구성됩니다.
    1) 얕은 복사의 값이 변하지 않는 대상(예를 들어 문자열, 원조, 수치 유형)인 경우, 부여된 값과 마찬가지로 대상의 메모리 주소 (id () 는 얕은 복사의 원래 값과 일치합니다.
    2) 얕은 복사본의 값이 가변 객체(예: 목록, 사전, 컬렉션 등)일 경우에도 두 가지 상황으로 나누어 논의해야 합니다.
    우선, 원래 값의 메모리 주소는 복사된 메모리 주소와 다르다.
  • 복사할 객체에 가변적인 하위 객체가 없을 때 원래 값(복사 값)의 변경은 복사 값(원래 값)에 영향을 주지 않습니다
  • 복사할 대상 안에 변경할 수 있는 하위 대상이 있을 때 이 하위 대상을 바꾸면 원래 값과 복사 값 사이에 서로 영향을 미친다
  • 3. 딥 카피


    딥 카피로 복사된 대상은 새로운 대상이며 원래의 대상과 아무런 관련이 없다.기존 객체를 변경하면 새 복제 객체에 영향을 주지 않습니다.

  • 불변 대상
  • 
    import copy
    #  
    # A = (1, 2, 'hello')   #  
    # A = 1                 #  
    A = 'hello'             #  
    
    print("******** ********")
    B = A
    print(id(A))
    print(id(B))
    print(A)
    print(B)
    
    print("******** ********")
    B = copy.copy(A)
    print(id(A))
    print(id(B))
    print(A)
    print(B)
    
    print("******** ********")
    B = copy.deepcopy(A)
    print(id(A))
    print(id(B))
    print(A)
    print(B)
    
    결과:
    *** **값 부여 *** ***
    1894005658264
    1894005658264
    hello
    hello
    * * * * 얕은 복사 * * * *
    1894005658264
    1894005658264
    hello
    hello
    ****** 딥 카피 ******
    1894005658264
    1894005658264
    hello
    hello
  • 가변 대상
  • 
    import copy
    #  
    A = [1, 2, 3]
    
    print("******** ********")
    B = A
    print(id(A))
    print(id(B))
    print(A)
    print(B)
    
    print("******** ********")
    B = copy.copy(A)
    print(id(A))
    print(id(B))
    print(A)
    print(B)
    
    print("******** ********")
    B = copy.deepcopy(A)
    print(id(A))
    print(id(B))
    print(A)
    print(B)
    
    결과:
    *** **값 부여 *** ***
    1602694308360
    1602694308360
    [1, 2, 3]
    [1, 2, 3]
    * * * * 얕은 복사 * * * *
    1602694308360
    1602694308424
    [1, 2, 3]
    [1, 2, 3]
    ****** 딥 카피 ******
    1602694308360
    1602950316296
    [1, 2, 3]
    [1, 2, 3]
  • 가변 객체가 외부 레이어를 수정합니다
  • 
    import copy
    #  
    A = [1, 2, 3, [11, 10, 20]]
    
    #  
    B1 = A                   #  
    B2 = copy.copy(A)        #  
    B3 = copy.deepcopy(A)    #  
    A.append(4)
    print("******** ********")
    
    print(id(A))
    print(id(B1))
    print(A)
    print(B1)
    
    print("******** ********")
    print(id(A))
    print(id(B2))
    print(A)
    print(B2)
    
    print("******** ********")
    print(id(A))
    print(id(B3))
    print(A)
    print(B3)
    
    결과:
    *** **값 부여 *** ***
    2215309238856
    2215309238856
    [1, 2, 3, [11, 10, 20], 4]
    [1, 2, 3, [11, 10, 20], 4]
    * * * * 얕은 복사 * * * *
    2215309238856
    2215593496776
    [1, 2, 3, [11, 10, 20], 4]
    [1, 2, 3, [11, 10, 20]]
    ****** 딥 카피 ******
    2215309238856
    2215593518024
    [1, 2, 3, [11, 10, 20], 4]
    [1, 2, 3, [11, 10, 20]]
  • 가변 객체가 내부 레이어를 수정합니다
  • 
    import copy
    #  
    A = [1, 2, 3, [11, 10, 20]]
    
    #  
    B1 = A                   #  
    B2 = copy.copy(A)        #  
    B3 = copy.deepcopy(A)    #  
    A[3].append(4)
    print("******** ********")
    
    print(id(A))
    print(id(B1))
    print(A)
    print(B1)
    
    print("******** ********")
    print(id(A))
    print(id(B2))
    print(A)
    print(B2)
    
    print("******** ********")
    print(id(A))
    print(id(B3))
    print(A)
    print(B3)
    
    결과
    *** **값 부여 *** ***
    2288591069768
    2288591069768
    [1, 2, 3, [11, 10, 20, 4]]
    [1, 2, 3, [11, 10, 20, 4]]
    * * * * 얕은 복사 * * * *
    2288591069768
    2288847138760
    [1, 2, 3, [11, 10, 20, 4]]
    [1, 2, 3, [11, 10, 20, 4]]
    ****** 딥 카피 ******
    2288591069768
    2288847168264
    [1, 2, 3, [11, 10, 20, 4]]
    [1, 2, 3, [11, 10, 20]]
    Python의 기초적인 부치, 얕은 복사, 깊은 복사의 차이에 관한 이 글은 여기에 소개되었습니다. 더 많은 Python의 부치 얕은 복사 깊은 복사의 차이에 관한 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 보십시오. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기