2014-11-18 2 views
0

1D 목록을 2D 목록에 여러 번 추가 할 때 2D 목록의 후속 변경 사항이 모든 행에 영향을 미치는 문제가 있습니다. 이 스레드 (Python list confusion)는 이유가 무엇인지 정리했습니다. 기본적으로 각 행은 동일한 하위 목록 또는 개체이므로 해당 하위 목록의 변경 사항이 2D 목록의 모든 행을 변경합니다. 그러나, 나는 그것을 고치는 방법을 모른다. 여기 내 예입니다다른 파이썬 목록에 목록 추가 추가

NumOfRows = 100 
LanesToCheck = [0, 1, 2, 3] 
Lanes = [] 
for j in range(0,NumOfRows): 
    Lanes.append(LanesToCheck) 

LanesToCheck 각 행을 초기화하는 데 사용되며, 아이디어는 내 스크립트의 사용자가 단지 쉬운 코드의 위치에서이 1D 목록을 변경할 수 있으며, 전체 2 차원 배열이 초기화되는 것입니다. 그냥 사용할 수 있습니다.

Lanes.append([0, 1, 2, 3]) 

하지만이 LanesToCheck 상수는 사용자가 쉽게 액세스 할 수 있도록하고 싶습니다. 각 행이 별도의 엔티티 인 방식으로이 1D 배열을 사용하여 2D 배열을 초기화하는 방법이 있습니까?

답변

2

사용이 : -

Lanes = [LanesToCheck[:] for j in range(NumOfRows)] 
# makes copy of `LanesToCheck` every time. 
이 작업을 수행하여 별도의 법인으로 모든 행을 사용할 수 있습니다

,

Lanes[0][0] = 11 

첫 번째 행의 첫 번째 열에 11을 삽입하면 다른 행은 변경되지 않습니다.

OUPUT : -

[[11, 1, 2, 3], [0, 1, 2, 3], ...... and so on 
+0

당신은 심지어리스트 comprehension을 사용할 수 있습니다 :'Lanes = [range (NumOfRows)의 j에 대해 LanesToCheck [:] ' –

+0

@ SergeBallesta 방금 행을 별도로 사용한다고 설명했습니다. 감사합니다. –

-1
Lanes = [0,1,2,3] * NumOfRows 

매우 파이썬 -하지만 어쩌면

, 당신은 당신이 목록의 사본을 만들고있어된다는 사실을 명시 적으로 만들고 싶어 :-(잘못 :

import copy 
Lanes = [copy.deepcopy(LanesToCheck) for i in xrange(NumOfRows)] 
+0

어쩌면 파이썬하지만하지 **하지 ** 대답 질문! '[0,1,2,3] * 2'는 list의 목록 대신에 [0,1,2,3,0,1,2,3]'1D list를 제공합니다. 그리고 [[0,1,2,3]] * NumOfRows는 심지어 내부 목록의 같은 인스턴스를 사용합니다 :'x = [[0,1,2,3]] * 2'' x [0] [ 0] = 11'은'[[10, 1, 2, 3], [10, 1, 2, 3]]' –

+0

맞습니다. – haavee