본문 바로가기
Python

2차원 리스트 생성

by Salgoo26 2021. 8. 1.

10 * 10 의 크기를 가진 2차원 리스트를 만들어야 한다고 하자.

 

우선 다음과 같이, * 연산자를 활용하여 리스트를 복사해 만들 수 있다.

# * 연산자를 이용하여 2차원 리스트 생성
test_list = [[0]* 10] * 10

print(*test_list, sep='\n') # 보기 좋게 출력
test_list[0][0] = 99 # 첫 번째 리스트의 첫 번째 값을 변경
print(*test_list, sep='\n') # 다시 출력
print(test_list[0] is test_list[1]) # 2차원 리스트 내 1차원 리스트가 동일한 주소를 참조하고 있나?


=>
[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, 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, 0, 0, 0, 0]

[99, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[99, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[99, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[99, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[99, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[99, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[99, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[99, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[99, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[99, 0, 0, 0, 0, 0, 0, 0, 0, 0]

True

위 코드 내용을 보면 알 수 있듯이, 간편하게 2차원 리스트를 만들 수 있으나, 각 리스트는 사실상 동일한 객체를 참조하고 있다. 즉, 하나의 리스트 원소를 바꾸면 나머지 9개의 리스트의 원소도 동일하게 변경된다.

 

 

그렇다면, 각각의 리스트가 다른 주소를 참조하게 하려면 어떻게 해야 할까? 즉, 내부의 리스트들이 각각의 원소를 바꿔도 서로에게 영향을 미치지 않도록하는 2차원 리스트를 만드려면?

 

# 반복문을 활용하여 2차원 리스트 생성
# 우선 각각의 1차원 리스트를 담을 빈 리스트를 만들어 둠
test_list = []
# 이중 for문을 통해, 리스트를 생성하고 각각의 리스트를 더해준다.
for _ in range(10):
    inner = []
    for _ in range(10):
        inner.append(0)
    test_list.append(inner)

print(*test_list, sep='\n')
test_list[0][0] = 99
print(*test_list, sep='\n')
print(test_list[0] is test_list[1]) # 2차원 리스트 내 1차원 리스트가 서로 같은 객체인가?

=>
[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, 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, 0, 0, 0, 0] 

[99, 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, 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, 0, 0, 0]

False

앞선 방법과는 다르게, 특정 리스트의 원소값을 변경해도 다른 리스트에 영향을 미치지 않음을 알 수 있다. 이 는 곧, 각 1차원 리스트가 독립된 객체임을 의미한다. 이는 is 연산자를 통해 확인한 결과와도 일치한다.

 

 

아래와 같이, list comprehension으로 더욱 간결하게 2차원 리스트를 만들 수 있다.

# List comprehension 이용
test_list = [[0 for _ in range(10)] for _ in range(10)]

print(*test_list, sep='\n')
test_list[0][0] = 99
print(*test_list, sep='\n')

=> 
[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, 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, 0, 0, 0, 0]

[99, 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, 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, 0, 0, 0]

역시, 각각의 리스트는 서로 다른 객체이기 때문에 하나의 원소를 바꿔도 다른 리스트엔 영향을 미치지 않는다.

'Python' 카테고리의 다른 글

제어문  (0) 2021.08.30
컨테이너  (0) 2021.08.30
enumerate() 내장 함수  (0) 2021.08.01
딕셔너리 구축 & comprehension  (0) 2021.08.01
표현식과 문장  (0) 2021.07.24

댓글