<플레이데이터>부트캠프의 기록/Python

Python_2 : 얕은복사와 깊은복사 (파이썬)

EZ_SOO 2022. 7. 5. 19:01

파이썬을 배우면서 너무 어려웠던 얕은복사와 깊은복사를 정리해보았다.

 

1.얕은복사

  • 변수 이름은 다르지만 결국 동일한 주소를 나타내는 경우
  • 결국 두 변수는 같은 변수나 다름없다.
In: arr=[10, 20, 30]
    copy1 = arr
    print(copy1)
Out: [10, 20, 30]

In: print(id(copy1), id(arr))
Out: 140682201559680 140682201559680
->얕은복사를 했기때문에 주소가 같다.

In: copy2 = copy1
    print(id(copy1), id(arr), id(copy2))
Out:140682201559680 140682201559680 140682201559680
->얕은복사를 했기때문에 주소가 같다.

In: copy2[2] = 156
    print(copy2)
Out: [10, 20, 156]

In: copy1
Out: [10, 20, 156] 

In: arr
Out: [10, 20, 156]

#얕은 복사로 주소를 복사해왔기 때문에 copy2를 건드렸는데 copy1과 arr의 값도 함께 바뀐다.

 

  • 위에서 사용한 예제를 이해하기 쉽게 파이썬 튜터로 살펴보자!

 

-> 같은 주소를 사용하고 있기 때문에 하나의 변수에 값이 변했을때 ('copy2[2]=156'을 통해 바뀐값) 다른 변수의

    값도 함께 변한다.

 

 

 

  • 슬라이싱하면 값도 제대로 바뀌고 원본도 보존되는 거 같은데 왜 얕은 복사라고 부르는걸까?
차원을 하나 더 깊게 들어가면 여전히 같은 메모리 주소를 복사하기 때문이다.

In: arr2D = ['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'Goodafternoon']]
    arr2Dcopy = arr2D
    print(arr2Dcopy)
Out: ['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'Goodafternoon']]

In: arr2Dcopy2 = arr2Dcopy[2:5]
    print(arr2Dcopy2)
Out:['Hi', ['Goodnight', 'Goodmorning', 'Goodafternoon']]
    
In: arr2Dcopy2[-1][-1] = 'night'
    print(arr2D, arr2Dcopy, arr2Dcopy2)
Out:['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'night']],
    ['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'night']],
    ['Hi', ['Goodnight', 'Goodmorning', 'night']]
    
In: arr2Dcopy2[-1] = 'night'
    print(arr2D, arr2Dcopy, arr2Dcopy2)
Out: ['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'Goodafternoon']],
     ['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'Goodafternoon']],
     ['night', 'night'])

 

 

 

->차원을 깊게 들어갔을 때 여전히 같은 메모리 주소를 쓰고 있다.

  • 위에서 사용한 예제를 이해하기 쉽게 파이썬 튜터로 살펴보자!

2. 깊은복사

  • 메모리주소를 참조해서 원본을 훼손하는 일을 막고있다.
  • copy라는 모듈의 deepcopy를 사용해야 한다.
In: import copy
    arr2D =['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'night']]
    arr2Ddeep = copy.deepcopy(arr2D)
    print(arr2Ddeep)
   
Out: ['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'night']]

In: arr2D[-1][-1] = 'morning'
    print(arr2D, arr2Ddeep)
Out: ['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'morning']],
     ['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'night']])
     
->deepcopy를 사용하면 서로의 변수에 영향을 미치지 않는다.

 

 

  • 위에서 사용한 예제를 이해하기 쉽게 파이썬 튜터로 살펴보자!

->깊은복사를 해왔기 때문에 마지막 변수에 mornig 변환이 다른 변수에게 영향을 미치지 않는다.