코딩하는 해맑은 거북이

[Python] 리스트(list) 복사, 얕은 복사(Shallow Copy), 깊은 복사(Deep Copy) 본문

Python/기본

[Python] 리스트(list) 복사, 얕은 복사(Shallow Copy), 깊은 복사(Deep Copy)

#CJE 2021. 1. 19.
해당 글은 리스트 복사 방법에 대해 다룬다.
1. 얕은 복사(Shallow Copy) : =(등호) 사용
2. 깊은 복사(Deep Copy)
  2.1 슬라이싱 (Slicing)
  2.2 list() 함수
  2.3 copy() 함수

cf) Call by Reference

리스트를 '='(등호)를 통해 리스트의 복사를 시도한다면, 이는 복사가 아닌 참조가 된다.

즉, 어느 한 곳의 값을 변경하면 똑같이 변경된다.

 

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = a       # call by reference (a, b는 동일한 주소를 가르킴)
a.append(100)

print(a)
print(b)

# Memory 주소값이 동일한지
print(f'a is b : {a is b}')
# 값이 같은지
print(f'a == b : {a == b}') 

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]

    a is b : True

    a == b : True

 

 

그럼 Call by Value깊은 복사(Deep Copy)하는 방법 여러개 중 3가지를 알아보겠다.

1. 슬라이싱 (Slicing)

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
c = a[:]        # call by value

print(a)
print(c)

# Memory 주소값이 동일한지
print(f'a is c : {a is c}')   # a is not c => True
# 값이 같은지
print(f'a == c : {a == c}')

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    a is c : False

    a == c : True

 

2. list() 함수

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
d = list(a)     # call by value

print(a)
print(d)

# Memory 주소값이 동일한지
print(f'a is d : {a is d}')   # a is not d => True
# 값이 같은지
print(f'a == d : {a == d}')

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    a is d : False

    a == d : True

 

3. copy() 함수

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
e = a.copy()    # call by value

print(a)
print(e)

# Memory 주소값이 동일한지
print(f'a is e : {a is e}')   # a is not e => True
# 값이 같은지
print(f'a == e : {a == e}')

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    a is e : False

    a == e : True

 

 

Comments