슬라이싱으로 값을 할당하면 새로운 id가 부여되어 서로 영향을 받지 않는다
a_arr = [1, 4, 6]
b_arr = a_arr[:]
b_arr[0] = 100
print(*a_arr) # 1 4 6
print(*b_arr) # 100 4 6
두 배열이 서로 다른 객체이기는 하지만, 객체 내 각 아이템은 각각 같은 메모리 주소를 가르킨다
깊은 복사는 내부 객체까지 전부 새로 복사되는 과정이다
copy.deepcopy
a
에b
를 할당하고 나서a
의 값의 변경이b
에 반영될 때도 있고, 안 될 때도 있다. 데이터 타입에 따라!
파이썬에는 mutable과 immutable 객체가 존재한다
list
, set
, dict
는 mutable한 반면,
bool
, int
, float
, tuple
, str
, frozenset
은 immutable하다
immutable 변수에 값을 할당하면 값을 변경하는게 아닌, 값의 재할당이 이루어지는 것이다
mutable 변수에
a = 2
b = a
a = 3
b = 4
print(a, b) # 3 4
b = a
에서 두 변수가 같은 메모리 주소를 바라보지만,
a = 3
에서 새로운 값이 할당되어 더이상 둘이 같은 곳을 바라보지 않는다. a
는 새로운 메모리 주소를 가르킨다
a_arr = [2, 2]
b_arr = a_arr
a_arr[1] = 3
b_arr[0] = 100
print(*a_arr) # 100 3
print(*b_arr) # 100 3
위는 변수 할당의 예시다
두 배열 모두 같은 메모리 주소를 가르킨다
둘 중 하나에 발생하는 변화는 다른 하나에 반영된다
a_arr = [1, 4, 6]
b_arr = a_arr[:]
b_arr[0] = 100
a_arr[1] = 10000
print(*a_arr) # 1 10000 6
print(*b_arr) # 100 4 6
위는 복사의 예시다
a_arr
를 복사해서 b_arr
라는 새로운 객체를 생성하기 때문에 b_arr
에 대한 변화가 a_arr
에 반영되지 않는다
a_arr
에 대한 변화도 b_arr
에 반영되지 않는다
a_2d_arr = [[1, 2], [3, 4]]
b_2d_arr = a_2d_arr
b_2d_arr[0][0] = 100
for i in range(2):
print(*a_2d_arr[i]) # [[100, 2], [3, 4]]
for j in range (2):
print(*b_2d_arr[j]) # [[100, 2], [3, 4]]
2-(1)와 같다
a_2d_arr = [[1, 2], [3, 4]]
b_2d_arr = [row[:] for row in a_2d_arr]
b_2d_arr[0][0] = 100
for i in range(2):
print(*a_2d_arr[i]) # [[1, 2], [3, 4]]
for j in range (2):
print(*b_2d_arr[j]) # [[100, 2], [3, 4]]
2-(2)와 같다