객체와 메모리 , 얕은 복사과 깊은 복사 본문
** 변수는 객체의 메모리 주소를 저장하고 이를 이용해서 객체를 참조한다
변수 <------객체의 메모리 주소 참조 ------> 객체
** 주로 객체를 복사할 때 나타나는 현상
** 얕은 복사 : 기존 변수를 새롭게 선언한 다른 변수에 할당했을때, 새롭게 선언된 변수는 메모리에 직접 접근하는 것이 아닌,
기존 변수의 주소값만을 복사해오는 방식으로 접근한다. 따라서 기존 레퍼런스 변수를 수정해도 새로운 변수에서 똑같은 내용이 호출된다.
** 객체 자체가 복사되는 것이 아니다!!
** 깊은 복사 : 객체 자체를 복사하는 것으로, 또 하나의 객체가 만들어진다. 새로운 주소의 메모리에 복사본을 생성하는 것.
** 객체 자체가 기존 변수의 메모리 주소와는 다른 위치에 복사되는 것이다.
** 여러가지 방법이 있음, 우선은 (모듈 copy 를 이용한다. import copy )
* copy.copy(group1)을 통해서 group2는 group1을 깊은 복사한 상태. group 2의 string 속성만 'new'로 바꾼 상태.
* 이때 group2를 출력하면 바뀐 값 new가 출력되지만, group1에서는 원래 값 original이 출력된다. 다른 주소에 저장되었기 때문!
** 리스트에서 원본을 유지하고 깊은 복사를 시행하는 방법
* id()로 메모리 주소 확인
* 얕은 복사를 시행한 상태에서는, 두 변수명이 같은 주소를 참조하고 있다는 사실을 확인 가능하다.
* for문으로 각각의 아이템들을 list.append()로 새롭게 써주게 되면, 깊은 복사가 되는데, 서로 다른 주소를 참조하고 있는것 확인.
* copy 모듈의 copy 함수로 손쉽게 깊은 복사 가능.
변수명 = 리스트.copy(대상 리스트)
* 슬라이싱한 데이터를 새롭게 할당하는 것 역시 깊은 복사
ex) 변수명 = 리스트[3:5]
'필요 없어진 항목들 > 프로그래밍 기본' 카테고리의 다른 글
개체 속성 변경 (0) | 2022.02.04 |
---|---|
클래스와 객체 생성 (0) | 2022.02.04 |
객체지향 프로그래밍 (0) | 2022.02.04 |