Python - copy, deepcopy

2021. 1. 19. 11:52·개발/PYTHON
목차
  1. mutable vs imutable
  2. 테스트
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
  1. mutable vs imutable
  2. 테스트
'개발/PYTHON' 카테고리의 다른 글
  • Python IMAP 메일 연동
  • CGI, WSGI, ASGI
  • Python 3.11 소식
  • PyCharm ssh sftp 연결하기
joolog
joolog
  • joolog
    JOO
    joolog
  • 전체
    오늘
    어제
    • 분류 전체보기 (165)
      • 개발 (83)
        • JAVA (29)
        • 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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.