array = [[] * (n + 1) for _ in range(n + 1)]
이렇게 선언하면 같은 리스트 참조 하는 거 없이 정상적으로 2차원 배열 만들어 지는데
array = [[] * (n + 1)]
막상 이렇게 1차원 배열로 선언하면 얕은 복사되서 다 같이 동기화 되버리는데
왜 전자에서는 같은 행에서 동기화 안되고 따로따로 넣을 수 있는 거임?
array = [[] * (n + 1) for _ in range(n + 1)]
이렇게 선언하면 같은 리스트 참조 하는 거 없이 정상적으로 2차원 배열 만들어 지는데
array = [[] * (n + 1)]
막상 이렇게 1차원 배열로 선언하면 얕은 복사되서 다 같이 동기화 되버리는데
왜 전자에서는 같은 행에서 동기화 안되고 따로따로 넣을 수 있는 거임?
그냥 for 문써라
전자는 그냥 예외같은 느낌임? 특수처리된거?
내가 병신이냐? 이새끼가 뭘 표현하고싶은건지 감도안잡힌다 ㄹㅇ
고수만 있는 건 아니구만
글 수정해놓고시발럼이 ㅋㅋ
??
아 원래가 맞네 ㄱㄷ
제목이 부족하네, 그러니깐 전자에도 결국 for문 안써서 초기화 하는 부분에서 얕은 복사 하는 건데, 왜 되는거야?
위에는 리스트 컴프리헨션이라는 문법이고 밑에는 니좆대로 적은건데
아니 컴프리헨션인건 다 알지; 그게 아니라 행을 복사할때 리스트는 연산자를 사용하면 얕은 복사가 일어나잖아. (아래처럼) 근데 내가 공부하는 책에서 2차원 배열을 저렇게 선언하길래, 직접해보니깐 얕은 복사가 발생 안함. 행마다 값을 넣을 수가 있어. 이 부분이 왜 가능한지 물어보는거야
밑에는 좆대로 적은 게 아니라 컴프리헨션 문법을 사용안하면 얕은 복사가 되는 예를 보여줄려고 넣은거야
행이 안만들어지는데 뭔소리야
밑에는 메모리 주소에 연산하는거랑 동일한거아님?
그렇지 아래가 안되는 건 맞는데, 위에가 왜 되는지 궁금함
컴파일러 구조상 예외처리 해놨나봄
두번째꺼 동기화 얘기가 뭔지 모르겠슴둥 두번째꺼 그냥 리스트 안에 1차원 리스트 하나만 생기지 안음??? 그래서 얕은 복사 같은 게 없을 거 같은데
arr = [[1,2,3]*3] 하면 [[1,2,3,1,2,3,1,2,3]] 이거아님..? 여기서 [0][0]을 7로 바꾸면 [[7, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]] 요거고
아 맞네;; [[1,2,3], [1,2,3], [1,2,3]] << 이렇게 만들어 지는 줄 알았음;; ㅈㅅㅈㅅ
graph1 = [[1] * 3] * 3 graph2 = [[1] * 3] 근데 앞에 리스트를 두고 똑같이 *3을 한건데 왜 전자는 앞에 *3은 [1,1,1] 이라는 정수를 인자로 가진 리스트를 만들고, 뒤에 *3은 리스트 자체를 복사하는 걸까. *라는 연산자가 어디에서는 리스트의 확장으로 사용되고, 어디에서는 리스트 자체의 복사로 사용되서 헷갈림..
배열 초기화 어디서 __getitem__이나 __setitem__으로 사용되는 []이 호출된단거임?
[foo]*n을 하면 같은 foo 객체 n개가 있는 리스트가 생기는 거임 이 foo가 리스트고 그런식으로 2차원 배열을 초기화하면 니가 첫번째 인덱스를 뭘로 선택하든 같은 리스트를 가리키니까 원하는대로 안되는 거고
한시간동안 뻘짓했는데 내가 한 소리 개소리다 graph1 = [[1] * 3] * 3 graph2 = [[1] * 3] 근데 앞에 리스트를 두고 똑같이 *3을 한건데 왜 전자는 앞에 *3은 [1,1,1] 이라는 정수를 인자로 가진 리스트를 만들고, 뒤에 *3은 리스트 자체를 복사하는 걸까. 라는 물음에 누가 답좀해줘라 궁금해죽겟다
ㄴ 둘 다 똑같이 * 바로 앞의 리스트 풀어내고 원소 복사 해서 리스트에 담음 [[1] * 3] * 3 : [1]*3 에서 *앞의 리스트 풀면 1 < 이게 원소, 이거 3개 복사 해서 리스트에 담음 [1,1,1] = [[1,1,1]]*3 : *앞의 리스트 풀면 [1,1,1] < 이게 원소 이거 3개 복사 해서 리스트에 담음 [[1,1,1],[1,1,1],[1,1,1]] = [[1,1,1],[1,1,1],[1,1,1]] 애초에 차이가 없음
차이가 있는건 내부 요소가 참조형일 때 얕은 복사가 된다는 거뿐
형님들 한 수 배우고 갑니다 하루 잘 마무리하세요
array = [[] * (n + 1)] 이게 아니라 array = [[]] * (n + 1) 이게 님이 원하는 질문같은데