1. a = “python”이라고 할 때, 아래의 값을 쓰시오.
(2) a[:] = "python" #이는 내용물까지 복사되는 깊은 복사를 의미함.
4. 아래 두 프로그램의 결과를 쓰시오. (10점)
a = [1, 2, 3, 4, 5] b = a b[1] = 100 print(a) |
1) 'b = a' 라고 제시하며, b에는 a의 내부 리스트가 들어가게 된다.
2) 'b[1] = 100', b의 내부리스트 앞에서 2번째 요소를 100으로 바꾼다는 의미이다.
3) print(a) = [1, 100, 3, 4, 5] Why? 얕은 복사로 인해 b가 바뀌면, a도 영향을 받아 바뀌는 건가?
a = [1, 2, 3, 4, 5] b = a[:] b[1] = 100 print(a) |
*** 차이점은 'b = a[:]' : 내부리스트가 변하지 않는 깊은 복사 ***
1) 'b = a[:]' 라고 제시되며, b는 a의 내부 리스트에 깊은 복사가 되어 들어간다.
이때, 후에 b에 변동이 생겨도 a의 내부리스트는 절때 변하지 않는다. (a[:]로 인해)
3) print(a) = [1, 2, 3, 4, 5]
Python 변수, 객체, 복사
# 파이썬에서 변수는 다음과 같이 사용할 수 있다. a = 1 b = 'python' c = [1,2,3] 변수 파이썬의 변수는 객체를 가리키는 것이다. 파이썬은 모든 것을 객체로 취급한다. type(3) # 3은 정수 상수가 아니라
whereisend.tistory.com
blueshw.github.io/2016/01/20/shallow-copy-deep-copy/
얕은 복사(shallow copy) vs 깊은 복사(deep copy)
이번에는 객체의 복사에 대해서 알아보려고 합니다. 객체의 복사는 크게 얕은 복사(shallow copy)와 깊은 복사(deep copy)로 나뉩니다. 얼핏 들으면 단어 자체의 의미가 모호하게 느껴질 수도 있습니다
blueshw.github.io
a = [1,2,3] a = [1,2,3]
b = a b = a[:] # [깊은복사(deep copy)는 복합객체 복사 + 그 내용도 재귀적으로 복사]
a[1] = 4 a[1] = 4
print(a) = [1, 4, 3]
a=[1, 4, 3] print(b) = [1, 2, 3] # a[:]를 통해 값이 고정되어, 뒷 수식에도 수정되지 않음.
ㅇ얉게, 복사하기
1) b = a
# b의 값도 변하게 된다. 이름만 다르고 가리키는 객체가 a와 같기 때문이다.
-> b = [1, 4, 3]
깊게, 즉 내용물까지 확실히 복사하기
2) b = a[:] #깊은복사
from copy import copy
b = copy(a)
b is a # 서로 다른 객체임을 확인할 수 있다.
False
1. 단순 객체복제
변수만 복사하다 보니 바라보는 객체는 당연히 동일하겠죠. 즉, 두개의 변수 중 하나만 변경되어도 나머지 하나도 동일하게 수정되는 현상이 발생하게 됩니다.
위와 같은 결과가 나타나는 이유는, 불변의 객체이기 때문입니다. 말장난 하는것 같아 보이지만, 불변의 객체란 값이 바뀌지 않는 객체를 뜻하죠. 그렇기 때문에 참조변수를 수정한다는 것은 같은 주소의 값(value)이 바뀌는 것이 아니라 그 변수에 새로운 객체가 할당되는 것을 뜻합니다.
2. 얕은 복사(shallow copy)
* 얕은복사(shallow copy)는 복합객체(껍데기)만 복사, 그 내용은 동일한 객체
얕은 복사의 경우는 어떨까요? 단순 복사와 어떤 차이가 있을까요? 단순 복제와 얕은 복사의 차이점은 복합객체(리스트)는 별도로 생성하지만 그 안에 들어가는 내용은 원래와 같은 객체 객체라는 점입니다.
값이 수정되는 것이 아니라 아예 새로운 객체로 변경되는 것입니다.
3. 깊은 복사(deep copy)
*깊은복사(deep copy)는 복합객체 복사 + 그 내용도 재귀적으로 복사
mutable 한 내부객체(내부리스트)의 문제를 해결하기 위해서는 얕은 복사가 아닌 깊은 복사(deep copy)를 해야 합니다.
얕은 복사가 복합객체(리스트)만 복사되고 그 안의 내용은 동일한 객체를 참조한다면, 깊은 복사의 경우에는 복합객체를 새롭게 생성하고 그 안의 내용까지 재귀적으로 새롭게 생성하게 됩니다.
그래서 깊은 복사를 하게 되면, 처음에 만들었던 객체와 복사된 객체가 전혀 달라지기 때문에 어느 한쪽을 수정한다고 해서 다른 한쪽이 영향 받는 일은 없게되겠죠.
정리해보면,
- 단순복제는 완전히 동일한 객체,
- 얕은복사(shallow copy)는 복합객체(껍데기)만 복사, 그 내용은 동일한 객체
- 깊은복사(deep copy)는 복합객체 복사 + 그 내용도 재귀적으로 복사
'프로그래밍 공부' 카테고리의 다른 글
Python, 에러메시지 유형정리 (0) | 2020.11.01 |
---|---|
Python 기본개념, 연산자 결합법칙( / vs // 차이점) (0) | 2020.11.01 |
함수활용 실습문제 11-16, 점수의 평균, 최고, 최저점 구하기 (0) | 2020.10.24 |
함수활용 실습문제 11-20, 커피 구매하기 (0) | 2020.10.24 |
함수활용 실습문제 11-19, 기차표 예매 (0) | 2020.10.24 |
댓글