ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬🐍] 얕은 복사 vs 깊은 복사
    프로그래밍/Python 2022. 7. 27. 17:06
    반응형

    얕은 복사 VS 깊은 복사

     

    코딩테스트 문제를 풀던 도중 문제가 발생했다.

    for i in range(len(nums)):
                n = nums
                n.pop(i)
                result.append(math.prod(n))

    나의 의도는

    n이 매번 '온전한' nums를 할당받는 것!

    그런데 인덱스 에러가 발생했다?

    # 프린트를 찍어봄
    nums: [2, 3, 4]
    n: [2, 3, 4]
    nums: [2, 4]
    n: [2, 4]

    오잉? 이럴수가! nums는 왜 변하는가

    nums는 건드리지도 않았는데 말이지

     

    그 이유는 '얕은 복사'를 했기 때문이었다.

     

    얕은 복사란 무엇인가?

    그걸 알기 위해선 먼저 mutable과 immutable의 개념부터 알아야 한다.

     

    1. Mutable과 Immutable

    Mutable : 변경이 가능한 객체 (ex. list, set, dictionary ...)

    Immutable : 변경이 불가능한 객체 (ex. int, float, tuple, str, bool...)

     

    오잉? int가 변경이 안된다고?

    a = 3 
    print(a) # 3
    a = 5
    print(a) # 5

    너무 잘되는데? 라고 생각했으나... 변경이 아니었다ㅠㅠ

    a는 5라는 새로운 값을 '재할당' 받은 것이다.

    여기서 변경이란 '주소값'이 변하는가 아닌가를 의미하는 것이다.

    a = 3
    print(hex(id(a))) # 0x7fb795b4c130
    a = 5
    print(hex(id(a))) # 0x7fb795b4c170

    2. 얕은 복사 (Shallow Copy)

    얕은 복사는 객체를 그대로 복사했다고 생각했지만 사실은 주소값을 참조하고 있는 것을 의미한다.

    그렇기 때문에 b의 값을 변경하면 a의 값도 똑같이 변경이 되는 것이다!

    a = [1,2,3]
    b = a
    print(hex(id(a))) # 0x7f838e79bd80
    print(hex(id(b))) # 0x7f838e79bd80

    immutable한 객체는 얕은 복사를 하여 값을 변경하더라도 무조건 '재할당'되기 때문에 상관이 없다.

    하지만 mutable한 객체는 그렇지 않기 때문에 신경을 써야하는 것이다.

    3. 깊은 복사 (Deep Copy)

    깊은 복사는 얕은 복사와 다르게 객체 자체를 복사하는 것을 의미한다. 

    copy 라이브러리의 deepcopy를 이용해 깊은 복사를 할 수 있다. 

    # import copy
    a = [1, 2, 3, 4]
    b = copy.deepcopy(a)
    print(hex(id(a))) # 0x7f1e38fc7d80
    print(hex(id(b))) # 0x7f1e38d89580

    주소값이 아예 다른 것을 확인할 수 있다!

     


     

    얕은 복사, 깊은 복사 주의해서 사용하자!

    반응형

    댓글

Designed by Tistory.