할당 (Assignment)
대입연산자(=)를 이용해서 변수에 값을 넣어주는 것이다.
a=5
b=a
b=100
print(a,b) #5 100
변수 a에 5를 할당하고 변수 b에 a가 가지고있는 값을 할당하였다.
b=a는 b=5와 동일하게 볼 수 있다.
b의 값이 변경된다고해서 a에 영향은 없다.
a=[1,2,3,4]
b=a
a[0]=100
print(a,b) #[100, 2, 3, 4] [100, 2, 3, 4]
변수 a 에는 리스트의 주소값이 저장되어 있다.
b=a는 a에 저장된 리스트의 주소값이 b에 복사되어 저장된 것이다.
a를 변경할 경우, 같은주소를 가리키는 b도 똑같이 변경된다.
b를 변경해도 동일하게 a에 반영된다.
얕은복사(Shallow copy)
a=[1,2,3,4]
b=a[:]
print(a,b) #[1, 2, 3, 4] [1, 2, 3, 4]
b[0]=100
print(a,b) #[1, 2, 3, 4] [100, 2, 3, 4]
리스트의 값을 전부 복사하기 위해 [:]을 이용했다.
값을 복사해서 b에 넣어주었을 뿐이다.
a, b는 다른주소값을 가지며 하나를 변경했을 때 다른것에 영향을 주지 않는다.
a=[1,2,3,[4,5]]
b=a[:]
print(a,b) #[1, 2, 3, [4, 5]] [1, 2, 3, [4, 5]]
b[3][1]=100
print(a,b) #[1, 2, 3, [4, 100]] [1, 2, 3, [4, 100]]
리스트안의 리스트는 주소값으로 복사되어 두 리스트가 연결된 것이 확인된다.
이렇기 때문에 얕은 복사라고 하는 것이다.
a=[1,2,3,[4,5]]
b=a.copy()
print(a,b) #[1, 2, 3, [4, 5]] [1, 2, 3, [4, 5]]
b[3][1]=100
print(a,b) #[1, 2, 3, [4, 100]] [1, 2, 3, [4, 100]]
copy()를 이용하여 얕은복사를 할 수 있다.
깊은복사(Deep copy)
import copy
a=[1,2,3,[4,5]]
b=copy.deepcopy(a)
print(a,b) #[1, 2, 3, [4, 5]] [1, 2, 3, [4, 5]]
b[3][1]=100
print(a,b) #[1, 2, 3, [4, 5]] [1, 2, 3, [4, 100]]
import copy하여 copy.deepcopy()를 이용하면 깊은복사를 할 수 있다.
리스트안의 리스트도 각각의 주소를 가지고 있으면서 하나의 값이 바뀌어도 영향을 주지 않는다.
반복되는 리스트 만들기
a=[[0]*3]*3
print(a) # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
a[0][0]=100
print(a) # [[100, 0, 0], [100, 0, 0], [100, 0, 0]]
[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 와 같은 리스트를 한번에 만들기 위해 [[0]*3]*3 으로 작성했다.
하지만 이 경우에 얕은복사되어 리스트안의 리스트 요소들이 같은 주소값을 가지고 있다.
하나의 값을 바꿀경우 모두 반영된다.
a=[[0]*3 for _ in range(3)]
print(a) # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
a[0][0]=100
print(a) # [[100, 0, 0], [0, 0, 0], [0, 0, 0]]
[0]*3 리스트를 세번만든다는 것을 반복문으로 만들어야 한다.
독립된 주소값을 가진 리스트가 만들어진 것을 확인할 수 있다.
'Language > Python' 카테고리의 다른 글
리스트 메서드 - append, extend, insert, remove, pop.... (0) | 2022.07.26 |
---|---|
파이썬 문자열메서드 - find, index, replace, split, strip, join .... (0) | 2022.07.26 |
파이썬 sort(), sorted() 차이 (0) | 2022.07.26 |
파이썬 - 재귀 함수 (recursive function) (0) | 2022.07.21 |
파이썬 - lambda 함수 (0) | 2022.07.21 |