Project Hub

얕은 복사와 깊은 복사 본문

Python/기초 개념

얕은 복사와 깊은 복사

safy 2022. 10. 14. 14:36
728x90
반응형

이전 글

2022.10.03 - [Python/기초 개념] - 숫자

 

숫자

파이썬 자료구조와 알고리즘 책 내용을 정리 1.1 정수 int 로 나타냄. 불변형 (immutable) 정수의 크기는 컴퓨터의 메모리 크기에 의해 제한된다. 적어도 32비트 정수를 나타내는 데 필요한 바이트 수

projecthub.tistory.com

 

Mutable & Immutable

아래의 내용은 이전 글에서 정리를 했으니 참고하면 된다.

2022.08.15 - [Python/기초 개념] - mutable object & immutable object

 

mutable object & immutable object

객체 Python 의 모든 데이터 타입은 객체(object)다. 객체에는 가변객체(mutable)와 불변객체(immutable)가 있다. 객체에는 3가지 특성인 값, 유형, 정체성이 있다.  값(Value): 가변 객체는 값이 변할 수 있

projecthub.tistory.com

Mutable

  • 수정 가능한 객체

Immutable

  • 수정 불가능한 객체
list mutable
set mutable
dict mutable
bool immutable
int, float immutable
tuple immutable
str immutable

 

얕은 복사와 깊은 복사

 

얕은 복사 (shallow copy)

  • 변수를 복사했지만 참조하는 곳은 동일 즉 같은 변수를 가리키고 있는 것.

사용 방법

  • 반복문을 통해 새로운 mutable 객체에 값 대입
  • 리스트 슬라이싱을 사용한 복사
  • copy 라이브러리 사용
import copy
# 얕은 복사

# 반복문 사용
def shallow_copy_use_for():
    original = [1, 2, 3, 4, 5]
    new = []

    for item in original:
        new.append(item)
    
    print(new)

# 리스트 슬라이싱 사용
def shallow_copy_use_slice():
    original = [1, 2, 3, 4, 5]
    new = original[:]

    print(new)

# copy 라이브러리 사용
def shallow_copy_use_copy():
    original = [1, 2, 3, 4, 5]
    new = copy.copy(original)

    print(new)

 

깊은 복사

  • 내부에 있는 객체 모두 새롭게 만듬

사용 방법

  • deepcopy  라이브러리 사용
  • .copy() 함수 사용

immutable in mutable

  • immutable 객체들을 담고 있는 mutable 객체에 얕은 복사를 사용할 경우 문제 없음.
  • 새롭게 대입된 immutable 객체는 기존의 immutable 객체와 같은 주소를 가지지만, immutable 객체의 수정이 불가능한 특생 때문

mutable in mutable

  • 얕은 복사는 mutable 객체가 담고있는 내부의 객체들을 복사하지 않기 때문에 mutable in mutable의 경우 완전한 복사가 이루어지지 않는다.
# immutable in mutable
def immutable_in_mutable():
    original = [1, 2, 3, 4, 5]
    new = original[:]
    new[0] = 10
    # original: 1,2,3,4,5
    # new: 10,2,3,4,5

# mutable in mutable
def mutable_in_mutable():
    original = [[1, 2], [3, 4], [5, 6]]    
    new = original[:]
    #new[0].append(7) - .append() 함수를 이용하면, 얕은 복사이기 때문에 original 과 new 모두 변경된다.
    #new[0] = [7, 8]  - new의 값만 변경된다.
    #new[0][0] = 7     - 모두 변경된다.
    print(id(original), id(new))
    for i in range(0, len(original)):
        print(id(original[i]), id(new[i]))
    print(original)
    print(new)
728x90
반응형

'Python > 기초 개념' 카테고리의 다른 글

문자열 패킹과 언패킹  (0) 2022.10.14
문자열  (0) 2022.10.14
숫자  (3) 2022.10.03
mutable object & immutable object  (0) 2022.08.15
Comments