본문 바로가기
프로그래밍 언어/Python

[python] 파이썬 리스트(list) 얕은 복사 vs 깊은 복사

by 까망 하르방 2021. 8. 21.
반응형

python 에는 변경할 수 있는 mutable 객체가 아닌 immutable 객체가 있다.

- listmutable한 객체이다.

 

얕은 복사 

- 원본에 영향 O

import copy

s = [10, 20, 30]
v = s

print(id(s), id(v))
print(id(s[0]), id(v[0]))

v[2] = 99

print(s) # 원본 출력
print(v)

 

깊은 복사 

- 원본에 영향 X

import copy
s = [10, 20, 30]
v = copy.deepcopy(s)

print(id(s), id(v))
print(id(s[0]), id(v[0]))

v[2] = 99

print(s) # 원본 출력
print(v)

 

깊은 복사처럼 보이는 얕은 복사

얼핏보면 원본에 영향을 주지 않으므로 깊은 복사 같지만.

- 인덱스 슬라이싱 얕은 복사에 해당

- copy 모듈의 copy 메소드도 얕은 복사

import copy

s = [10, 20, 30]
v2 = s[0:]
v3 = copy.copy(s)

print(id(s), id(v2), id(v3))
print(id(s[0]), id(v2[0]), id(v3[0]))

v2[2] = 99
v3[0] = 5

print(s) # 원본 출력
print(v2)
print(v3)

 

mutable 객체 안에 mutable 객체가 있는 경우 문제가 발생한다.

- 리스트 변수 자체는 다른 메모리 주소를 가진것으로 보일 수 있지만

  안에 내부원소들은 서로 같은 주소를 바라보고 있다.

ex) 리스트 안에 또 다른 리스트

 

copy를 사용한 list 복사

l1 = [[1,2],[3,4]]
l2 = l1.copy()

l1[1] = [0] * 3
l1[0][0] = 10
l2[0][1] = 20

for x in (l1 , l2) :
    print(id(x), x)

 

copy.deepcopy를 사용한 list 복사

import copy

l1 = [[1,2],[3,4]]
l3 = copy.deepcopy(l1)

l1[1] = [0] * 3
l1[0][0] = 10
l3[0][1] = 20

for x in (l1 , l3) :
    print(id(x), x)

반응형

댓글