티스토리 뷰

반응형

코드를 짜면서 종종 이중 배열을 초기화하는 경우가 있다. 이때 조심해야할 부분을 알려줄려고 이렇게 글을 적고자 한다.

 

보통 초기화하는 방법은 3가지 정도 있습니다.

 

1. [['-'] *3 for _ in range(3)]

이러한 케이스는 어떨까요?

 

확인해볼까요?

 

지금 2번째 사진을 보고 어? 뭐지 왜 id가 다 같지?

라고 생각이 문득 들 수가 있습니다. 하지만 안심하세요. 파이썬에서는 스트링에 대해서 모두 공유를 하는 성격을 가지고 있어서 id가 같은 것입니다.

 

그렇죠?

 

우리는 하나의 요소가 아닌 row의 id가 같은 지 확인 해봐야 합니다.

결과를 보면 다르는 것을 볼 수가 있습니다.

 

쉽게 설명하기 위해서 알아보기 쉽게 변환해보도록 해봅시다.

 

xbox1 = []
for _ in range(3):
    row = ['-']*3
    xbox1.append(row)

이렇게 보니 왜 row 의 id가 다른지 이해가 가시죠?

 

그러면 한 번 값의 변화를 줬을 때 어떻게 변할까요?

 

어셈블러로 동작했을 때는

 

2. [['-']*3]*3

사실 이 글을 쓴 이유는 2번 스타일을 지양하자고 말하고 싶어서 쓰게 되었습니다. (물론 의도적으로 이렇게 할 수도 있습니다.)

 

3번 째 사진을 보면 row의 아이디가 다 같은 것을 볼 수가 있습니다. 왜그럴까요? 

한 번 풀어서 써보겠습니다.

 

xbox2 = []
row = ['-'] * 3
for _ in range(3):
    xbox2.append(row)

똑같은 결과가 나온 것을 볼 수가 있습니다.

그렇습니다. 같은 row이므로 하나의 row에 대해서도 변화를 주게 되면 같은 행이 다 변하게 됩니다.

 

어셈블러로 동작했을 때는

3. [ [ '-' for _ in range(3)] for _ in range(3)]

솔직히 이것은 안봐도 뻔하죠? ㅎㅎ 그래도 한 번 보도록 하겠습니다.

 

 

 

 

 

결론

이중 배열을 썼을 때  2번 스타일 형태의 복사만 안하셔도 많은 트러블에서 벗어날 수 있습니다. 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함