Python - copy, deepcopy

2021. 1. 19. 11:52·개발/PYTHON
728x90
반응형

프로젝트 진행 중 중복된 데이터가 내려온다그래서 확인해보니

로직은 copy를 했고 다른 데이터를 서로 집어 넣었거늘 왜 중복이 되었는가!!

누군가 카피를 해도 뮤터블(mutable)은 카피가 되지 않는다 그래서 테스트를 해보았다.


mutable vs imutable

먼저 mutable과 imutable을 알고 가는게 좋겠다.

쉽게 설명하면 변경 가능한 객체(mutable) / 변경 불가능한 객체(imutable)이 되겠다.


테스트

import copy

a = ['1', ['2'], '3']
print('a', a, id(a))

b = copy.copy(a)
print('b', b, id(b))

c = copy.deepcopy(a)
print('c', c, id(c))
# a ['1', ['2'], '3'] 4493907136
# b ['1', ['2'], '3'] 4493907200
# c ['1', ['2'], '3'] 4493889216

print('a[]', a[1], id(a[1]))
print('b[]', b[1], id(b[1]))
print('c[]', c[1], id(c[1]))
# a[] ['2'] 4491935424
# b[] ['2'] 4491935424
# c[] ['2'] 4494297472

a.append('5')
a[1].append('4')

print('a', a, id(a))
print('a[]', a[1], id(a[1]))
print('b', b, id(b))
print('b[]', b[1], id(b[1]))
print('c', c, id(c))
print('c[]', c[1], id(c[1]))

# a ['1', ['2', '4'], '3', '5'] 4493907136
# a[] ['2', '4'] 4491935424
# b ['1', ['2', '4'], '3'] 4493907200
# b[] ['2', '4'] 4491935424
# c ['1', ['2'], '3'] 4493889216
# c[] ['2'] 4494297472

보는거 처럼 뮤터블한 리스트를 copy, deepcopy를 복사하면 보는 아이디가 달라지지만

copy는 리스트안에 또 리스트가 있는 경우 바라보는 주소가 같고 deepcopy는 다른걸 볼 수 있다.

aa = ['1', {"a": "2"}, '3']
print('aa', aa, id(aa))

bb = copy.copy(aa)
print('bb', bb, id(bb))

cc = copy.deepcopy(aa)
print('cc', cc, id(cc))
# aa ['1', {'a': '2'}, '3'] 4493987712
# bb ['1', {'a': '2'}, '3'] 4493987136
# cc ['1', {'a': '2'}, '3'] 4493987456

print('aa{}', aa[1], id(aa[1]))
print('bb{}', bb[1], id(bb[1]))
print('cc{}', cc[1], id(cc[1]))
# aa{} {'a': '2'} 4492632384
# bb{} {'a': '2'} 4492632384
# cc{} {'a': '2'} 4493018752

aa.append('5')
aa[1].update({"b": "3"})

print('aa', aa, id(aa))
print('aa{}', aa[1], id(aa[1]))
print('bb', bb, id(bb))
print('bb{}', bb[1], id(bb[1]))
print('cc', cc, id(cc))
print('cc{}', cc[1], id(cc[1]))
# aa ['1', {'a': '2', 'b': '3'}, '3', '5'] 4493987712
# aa{} {'a': '2', 'b': '3'} 4492632384
# bb ['1', {'a': '2', 'b': '3'}, '3'] 4493987136
# bb{} {'a': '2', 'b': '3'} 4492632384
# cc ['1', {'a': '2'}, '3'] 4493987456
# cc{} {'a': '2'} 4493018752

copy 한 객체 안에 딕셔너리도 마찬가지..

 

마지막으로 .. 리스트안에 리스트안에 리스트안에 리스트.. 도 같을까 ? (같겠지)

aaa = ['0', ['1', ['2', ['3', ['4', ['5']]]]]]
bbb = copy.copy(aaa)
print('aaa', aaa, id(aaa))
print('aaa', aaa[1], id(aaa[1]))
print('aaa', aaa[1][1], id(aaa[1][1]))
print('aaa', aaa[1][1][1], id(aaa[1][1][1]))
print('aaa', aaa[1][1][1][1], id(aaa[1][1][1][1]))
print('aaa', aaa[1][1][1][1][1], id(aaa[1][1][1][1][1]))

print('bbb', bbb, id(bbb))
print('bbb', bbb[1], id(bbb[1]))
print('bbb', bbb[1][1], id(bbb[1][1]))
print('bbb', bbb[1][1][1], id(bbb[1][1][1]))
print('bbb', bbb[1][1][1][1], id(bbb[1][1][1][1]))
print('bbb', bbb[1][1][1][1][1], id(bbb[1][1][1][1][1]))

aaa[1][1][1][1][1].append('6')
print('aaa', aaa, id(aaa))
print('bbb', bbb, id(bbb))

# aaa ['0', ['1', ['2', ['3', ['4', ['5']]]]]] 4494000256
# aaa ['1', ['2', ['3', ['4', ['5']]]]] 4494000192
# aaa ['2', ['3', ['4', ['5']]]] 4493987776
# aaa ['3', ['4', ['5']]] 4493987648
# aaa ['4', ['5']] 4493987584
# aaa ['5'] 4493987008
# bbb ['0', ['1', ['2', ['3', ['4', ['5']]]]]] 4494000320
# bbb ['1', ['2', ['3', ['4', ['5']]]]] 4494000192
# bbb ['2', ['3', ['4', ['5']]]] 4493987776
# bbb ['3', ['4', ['5']]] 4493987648
# bbb ['4', ['5']] 4493987584
# bbb ['5'] 4493987008
# aaa ['0', ['1', ['2', ['3', ['4', ['5', '6']]]]]] 4494000256
# bbb ['0', ['1', ['2', ['3', ['4', ['5', '6']]]]]] 4494000320

 

조심하자 .. copy 할때는

728x90
반응형
저작자표시 (새창열림)

'개발 > PYTHON' 카테고리의 다른 글

Python 용량 변환  (0) 2024.11.11
Python IMAP 메일 연동  (1) 2024.11.08
CGI, WSGI, ASGI  (4) 2024.09.12
Python 3.11 소식  (0) 2022.05.23
PyCharm ssh sftp 연결하기  (0) 2022.05.13
'개발/PYTHON' 카테고리의 다른 글
  • Python IMAP 메일 연동
  • CGI, WSGI, ASGI
  • Python 3.11 소식
  • PyCharm ssh sftp 연결하기
joolog
joolog
  • joolog
    JOO
    joolog
  • 전체
    오늘
    어제
    • 분류 전체보기 (166) N
      • 개발 (84) N
        • JAVA (30) N
        • PYTHON (9)
        • AWS (15)
        • DOCKER (2)
        • PERCONA (2)
        • ORACLE (14)
        • MYSQL (1)
        • 알고리즘 (0)
        • 기타 (11)
      • 툴 (5)
        • MARKDOWN (1)
        • GIT (1)
        • DOCKER (1)
        • PyCharm (2)
        • IntelliJ (0)
      • 일상 (35)
        • 맛집 (6)
        • 카페 (2)
        • 요리 (4)
        • 글씨 연습 (2)
        • 그저 일상 (7)
        • 내돈 내산 (11)
        • 홍보 (1)
      • 국내 여행 (1)
      • 해외 여행 (15)
        • 체코-오스트리아 (10)
        • 일본 (5)
      • 암 일지 (26)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리
    • 티스토리 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    jdbc
    오라클
    오스트리아
    잘츠부르크
    티스토리챌린지
    갑상선 암
    저요오드식
    오닉스 리프3
    성모샘쉼터
    히로시마
    요양병원
    동위원소
    재발
    체코
    mysql
    자바JDBC
    Oracle
    자바
    오블완
    글씨연습
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
joolog
Python - copy, deepcopy
상단으로

티스토리툴바