[Python] 리스트 초기화

Woody의 기록·2023년 12월 5일
2

Python

목록 보기
2/4

리스트 초기화 방법

파이썬에서 리스트를 초기화 하는 방법에는 여러가지가 있다.

(1) for문을 통해 초기화하고자 하는 크기만큼 리스트에 append 해주는 방법이 있고,

(2) *연산자로 초기화하는 방법도 있으며, (3) 리스트 컴프리헨션내에 for문을 넣어 초기화 할 수도 있다.

📌 1차원 리스트의 초기화

우선 가장 기본이되는 1차원 리스트부터 살펴보자.

가장 원시적인 방법은 빈 리스트를 선언 후, for문을 돌면서 초기화할 값을 append 해주는 것이다.

하지만 더 편한 방법들이 많아 특정 크기로 초기화 할 때는 잘 쓰이지는 않는다.

다음 방법은 1차원 리스트를 선언하는 방법중 가장 편한 방법으로, * 연산자를 사용하는 것이다.

파이썬은 [초기화할값]*길이 연산의 결과로 길이가 N이고 특정 값으로 초기화된 리스트를 생성할 수 있다.

예를 들어 모든 원소가 0이고 길이가 5인 리스트는 [0] * 5로 생성할 수 있다.

[x] * N는 N개의 x로 이루어진 리스트를 의미하며, 이를 통해 하나의 리스트 레퍼런스가 반환된다.

마지막으로 리스트 컴프리헨션내에 for 문을 이용하여 추가하는 방식이 있다.

1 차원 리스트 초기화 예시

# 원소가 모두 0이고 길이가 N인 1차원 리스트 초기화

N = 5

# 단순하게 append를 반복하여 원소 초기화
myList = []
for i in range(N):
	myList.append(N)
print(myList)
'''
[ 0, 0, 0, 0, 0 ]
'''

# * 연산자를 통한 초기화
myList = [0] * N
print(myList)
'''
[ 0, 0, 0, 0, 0 ]
'''

# 리스트 컴프리헨션을 이용한 초기화
myList = [0 for _ in range(N)]
print(myList)
'''
[ 0, 0, 0, 0, 0 ]
'''

📌 2차원 리스트 초기화

2차원 리스트는 1차원 리스트를 원소로 하는 리스트이다.

우선 1차원 리스트 초기화 과정을 for 문으로 원하는 크기만큼 반복하면 2차원 리스트의 초기화가 완료된다.

초기화 할 때 원소들이 동일한 레퍼런스를 참조하지 않도록 주의하여 for 루프를 통해 초기화 해준다.

2차원 리스트의 초기화 예시

# 원소가 모두 0이고 길이가 RxC인 1차원 리스트 초기화
R, C = 2, 3

# 길이가 C인 1차원 리스트를 * 연산자로 생성하는 과정을 for문으로 반복
myList = [[0] * C for _ in range(R)]
print(myList)
'''
[0, 0, 0]
[0, 0, 0]
'''

# 길이가 C인 1차원 리스트를 for 문으로 생성하는 과정을 다시 R번 반복
myList = [[0 for _ in range(C)] for _ in range(R)]
print(myList)
'''
[0, 0, 0]
[0, 0, 0]
'''

📌 3차원 리스트의 초기화

3차원 리스트는 2차원 리스트를 원소로 하는 리스트이다.

따라서 리스트 컴프리헨션에 for 문을 사용하여 원하는 크기만큼 2차원 리스트를 초기화하는 과정을 반복해주면 된다.

초기화 할 때 원소들이 동일한 레퍼런스를 참조하지 않도록 for 루프를 통해 초기화 해준다.

3차원 리스트의 초기화 예시

# 원소가 모두 0이고 길이가 RxCxH인 3차원 리스트 초기화

R, C, H = 2,3,4

myList = [[[0] * C for _ in range(R)] for _ in range(H)]
''' 
[[[0, 0, 0], 
  [0, 0, 0]],
 [[0, 0, 0], 
  [0, 0, 0]],
 [[0, 0, 0], 
  [0, 0, 0]],
 [[0, 0, 0], 
  [0, 0, 0]]]
'''

myList = [[[0 for _ in range(C)] for _ in range(R)] for _ in range(H)]
''' 
[[[0, 0, 0], 
  [0, 0, 0]],
 [[0, 0, 0], 
  [0, 0, 0]],
 [[0, 0, 0], 
  [0, 0, 0]],
 [[0, 0, 0], 
  [0, 0, 0]]]
'''

# 3차원 리스트 형태로 보기 편하게 출력
cur = 0
for h in myList:
    print("---h={}---".format(cur))
    cur += 1
    for r in h: 
        print(r)
    print("-"*9)

'''
---h=0---
[0, 0, 0]
[0, 0, 0]
---------
---h=1---
[0, 0, 0]
[0, 0, 0]
---------
---h=2---
[0, 0, 0]
[0, 0, 0]
---------
---h=3---
[0, 0, 0]
[0, 0, 0]
---------
'''

📌 N차원 리스트 초기화 시, 잘못된 초기화

N차원 리스트 초기화시 주의점이 있다. 2차원 리스트를 예시로 들어보자.

2차원 리스트는 각 원소가 1차원 리스트인 리스트이다. * 연산자로 길이가 C인 1차원 리스트를 만들어 준 후,

해당 리스트를 다시 * 연산자로 R만큼 연산해주면 동일한 1차원 리스트를 참조하는 R개의 원소가 생성된다.

하지만 초기화 후 겉보기에는 제대로 된 것처럼 보여 인지하지 못할 수 있다.

이런 방식은 잘못된 초기화이므로 주의해야한다.

R, C = 2, 3

myList = [[0] * C] * R

for row in myList: 
    print(row)
'''
[0, 0, 0]
[0, 0, 0]
'''

눈으로 보기에는 제대로 초기화 된 것 처럼 보이지만,

위와 같이 초기화 하면 모든 row가 동일한 list의 레퍼런스를 참조하게 되는 문제가 발생한다.

우선 [0] * C를 통해 생성된 1차원 리스트가 생성된다. 이 리스트를 다시 * 연산자로 R번 연산하여 생성하면,

R개의 원소는 모두 동일한 리스트의 레퍼런스를 가지게 된다.

문제점은 값을 변경해보면 알 수 있다. 예를 들어, myList[0][1]의 값을 1로 변경하고 출력해보면,

myList[0][1] 뿐만 아니라 myList[1][1]도 변경된 것을 볼 수 있는데

이것은 잘못된 초기화로 인해 myList[0]과 myList[1]이 동일한 레퍼런스를 가리키고 있기 때문이다.

myList[0][1] = 1

for row in myList: 
    print(row)

'''
[0, 1, 0]
[0, 1, 0]
'''

myList[0]과 myList[1]의 id 값을 직접 찍어보아도 동일한 참조인 것을 확인할 수 있다.

# 0번 row와 1번 row가 사실 동일한 reference를 가지고 있다.
print(id(myList[0]))
print(id(myList[1]))

'''
140195185890112
140195185890112
''''
profile
Github - https://www.github.com/woody35545

0개의 댓글