C언어의 경우 n차원 리스트로 2*3*4크기를 만든다면 int arr[2][3][4];이런식으로 선언만하면 만들어지지만, python의 경우 append형식이기에 기본적으로 n차원 리스트로 선언이 불가하다.
과거 C를 하다가 python으로 넘어온 필자의 경우 append 방식이 익숙하지 않아서 python에도 미리 선언해두고 값만 바꾸는 방법을 쓰기 위한 이유로 여러 자료를 찾은 적이 있다.
기본적으로 n차원 리스트를 선언하는 예로 2차원으로 n*m의 리스트를 선언한다고 하면
for i in range(5):
list1.append([0, 0, 0, 0, 0, 0, 0, 0])
print(list1)
#output:
#[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
이런식이다. 여기서 n은 5, m은 8(append함수로 추가되는 list)이다.
리스트 안에 리스트 형식으로 추가되게 된다.
다음으로 numpy 라이브러리를 사용하는 방식이 있다.
import numpy as np
array=np.zeros((2,4,3))
print(array)
#output:
# array([[[0., 0., 0.],
# [0., 0., 0.],
# [0., 0., 0.],
# [0., 0., 0.]]
# [[0., 0., 0.],
# [0., 0., 0.],
# [0., 0., 0.],
# [0., 0., 0.]]])
np.zeros의 경우 모두 0으로 초기화한다. np.ones는 모두 1로 초기화한다.
기본적으로 float로 선언된다. 그렇기에 int형식의 리스트를 쓰고 싶다면 다음 방법을 사용하자.
다음으로는 리스트 컴프리헨션방법이 있다.
lsit=[[0 for __ in range(4)] for _ in range(3)]
print(lsit)
#output:
#[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
이렇게하면 3*4크기의 리스트를 만든 것이다. for 앞에 0은 초기화할 수이다. 이 수를 1로 바꾸면 모두 1로 초기화된다.
3차원으로 선언하고 싶다면
lsit = [[[0 for ___ in range(4)] for __ in range(3)] for _ in range(2)]
print(lsit)
#output
#[[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]
이런식으로 작업하면 된다.
이렇게하면 2*3*4크기의 3차원 리스트로 초기화 할 수 있다.
보통 기본적인 파이썬 지식을 가르치기 위해서는 1번째, 편의성을 위해서는 3번째 방법을 많이 사용한다.
이 글을 적으면서 알게 된 점이 있는데,
lsit = [[[0 for _ in range(4)] for _ in range(3)] for _ in range(2)]
print(lsit)
lsit = [[[0 for ___ in range(4)] for __ in range(3)] for _ in range(2)]
print(lsit)
#output
# [[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]
# [[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]
이거 둘다 출력이 같다. 즉 똑같이 초기화된다. 굳이 for 안에 변수 i,j,k(다른 변수로 비유하면)하는것처럼 하지 않고 i만 연달아 적어도 되나보다.
파이썬에서 이런 반복문에 들어가는 i,j등와 같은 변수가 값으로 사용되지 않는 경우에는 _를 쓰는데 이는 해당 변수가 사용되지 않을 것을 보여주며 혹시 모를 다른 변수들과의 간섭을 방지할 수 있다. 또한 아까 말했듯 재사용도 한번에 선언 할때 n차원이라도 _을 몇번을 써 선언해도 문제가 없기에 또한 파이썬에서 이런 반복문에 들어가는 i가 버려지는 값, 즉 사용하지 않는 값이라면 _를 쓰는 이유는 다른 곳에서 사용될 수 있는 변수들과 혹시 간섭이 일어나는 것을 방지하기 위해 _를 쓴다.
여기서 _는 선언할 때에 쓰기에 재사용성이 없다. 그렇기에 _를 쓰는 것이다.