할당 (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 리스트를 세번만든다는 것을 반복문으로 만들어야 한다.

독립된 주소값을 가진 리스트가 만들어진 것을 확인할 수 있다.