본문 바로가기

코딩테스트/🔠 문법 & Language

[python] 2차원 배열 생성 시 * 과 for 사용의 차이

리스트에서 *를 사용하면 요소 시퀀스를 반복한다.

[0] * 3 
>> [0,0,0]

[0,1] * 3
>> [0,3,0,3,0,3]

2차원배열을 만들 때, 주의할 점이 있다.

# *를 사용한 2차원배열 생성
[[0] * 3]* 2
>> [[0,0,0],[0,0,0]]

# for를 사용한 2차원 배열 생성
[[0]*3 for _ in range(2)]
>> [[0,0,0],[0,0,0]]

두 가지 방법 모두 결과물이 똑같아 보이지만 다르다.

*을 사용한 방식은 반복 횟수만큼 같은 [0]*3 의 참조가 늘어나는 것이고

for를 사용한 방식은 반복 횟수만큼 새로운 [0]*3을 만들어 넣는 것과 같다.

그래서 *를 사용한 방식은 모든 행이 같은 객체를 참조하고 있어서 한 행의 원소를 바꾸면 모든 행의 원소가 바뀐다.

2차원 배열을 생성할 때는 꼭 for를 사용하여 만들도록 하자.

 

 

Q. 그렇다면, [0] * 3 과 같은 일차원 배열을 만들 때에는 왜 를 써도 되는지?

0이라는 값은 불변값이다. 매번 새로운 객체가 만들어지고 바꿀 수 없다.

변수 a, b 가 각각 0이라는 값을 가질 때, a 값을 변경해도 b값에는 영향이 없는 것과 같다.

하지만 1차원 배열은 가변값이기 때문에 같은 객체를 여러 번 참조하게 되면 한 번의 수정이 모든 참조에 영향이 가게 된다.