본문 바로가기

짜투리

[python] 2차원 리스트를 생성하고 요소 변경하는 차이

728x90

 

 BFS하면서 생성한 2차원 리스트의 요소가 이상하게 변경돼서 한창 고민했엇따. 

 

 

바로 39,40 연산에서 값이 이상하게 삽입되는거다..!!!

 

 

 

 처음에 리스트를 저렇게 선언했는데, 디버깅하면서 보니까, 0,2값 뿐만 아니라 2열 값이 모두 변경된 것을 보고 

 

 

 에?? 모지 싶어서 리스트 함축을 써서 선언해서 바꿔보니까 그건 내가 원하는 대로 돌아갔다. 

 

 

 

 둘다 똑같은 리스트 선언인데 다른 연산이 되니까 신기하지 않은가용??? 그래서 랩실 사람들한테 물어보니까 

 

 

 

 JO오빠가 굉장히 싸가지 없이 말하는 것 같지만, 실제로도 싸가지가 좀 없는 것 같다. 

 

 https://stackoverflow.com/questions/15654800/what-is-the-difference-between-0-for-in-range10-for-in-range10-and

 

What is the difference between [[0 for _ in range(10)] for _ in range(10)] and [0 for _ in range(10)] * 10?

>>> CM = [[0 for _ in range(10)]] * 10 >>> CM [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], ...

stackoverflow.com

 

아무튼 링크에 내용은 *연산자가 참조를 복사했기 때문이라고 한다. 실험해보니까 행은 무시하고 지정한 모든 열의 값을 바꿔버린다. 

 

 

 

 

 


<결론>

 

*를 이용해서 행렬을 만들면 참조를 복사하기 때문에 저딴 오류가 난다. 리스트 함축을 사용하자!

 

a=[[0]*10]*10
b=[[0 for j in range(10)] for i in range(10)]