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 |