2014-01-10 3 views
10
I이 7 × 7을 2 차원 배열이 변화

:파이썬 2 차원 어레이 - 요소

l=[[1, 1, 1, 1, 1, 1, 1], 
    [1, 0, 2, 0, 0, 0, 1], 
    [1, 0, 0, 0, 0, 0, 1], 
    [1, 0, 0, 0, 0, 0, 1], 
    [1, 0, 0, 0, 0, 0, 1], 
    [1, 0, 0, 0, 0, 0, 1], 
    [1, 1, 1, 1, 1, 1, 1]] 

시피 L을 [1] [2] = 2. 인쇄 할 때 요소가 올바르게 인쇄됩니다. 여기에 문제 없습니다. 그러나 "2"에서 "3"또는 다른 숫자로 변경하려고하면 첫 번째 및 마지막 열을 제외하고 해당 열 (이 경우 세 번째 열)의 모든 요소가 변경됩니다. 이 코드를 입력하면 예를 들어, :

l[1][2]=5 

을 한 후 2 차원 배열을 인쇄, 내가 얻을이 :

l=[[1, 1, 1, 1, 1, 1, 1], 
    [1, 0, 5, 0, 0, 0, 1], 
    [1, 0, 5, 0, 0, 0, 1], 
    [1, 0, 5, 0, 0, 0, 1], 
    [1, 0, 5, 0, 0, 0, 1], 
    [1, 0, 5, 0, 0, 0, 1], 
    [1, 1, 1, 1, 1, 1, 1]] 

이것은 내가 선택한 모든 요소에 발생합니다. 해당 요소 만 변경하는 대신 전체 열을 변경합니다. 문제가 무엇인지 아는 사람이 있습니까? 고맙습니다!

+1

재현되지 않음 새 목록에있는 모든 사람들을 분리합니다 목록을 수정하기 전에. – thefourtheye

+1

재현 할 수 없습니다. 파이썬 인터프리터에서이 모든 것을 직접 실행할 수 있습니까? 어떤 파이썬을 사용하고 있습니까? – lpapp

+0

NumPy 행렬 또는 동일한 목록에 대한 여러 참조가있는 경우에도 마찬가지입니다. 실제 통역 세션을 보여 주시겠습니까? – user2357112

답변

20

당신이 묘사 한 행동 (당신이 설명했듯이)은 불가능합니다.

목록을 만드는 경우 각 하위 목록이 다른 목록인지 확인해야합니다. 다음을 고려하십시오.

a = [] 
b = [a, a] 

여기 두 개의 하위 목록이 모두 똑같은 목록을 만들었습니다. 하나를 변경하면 두 가지 모두에 표시됩니다. 예컨대 : 자주 목록이 동작을 볼 수

>>> a = [] 
>>> b = [a, a] 
>>> b[0].append(1) 
>>> b 
[[1], [1]] 

* 연산자를 사용하여 초기화 :

a = [[None]*7]*7 

예를

>>> a = [[None]*7]*7 
>>> a 
[[None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None]] 
>>> a[0][1] = 3 
>>> a 
[[None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None]] 

수정이 외측리스트에 * 7을 사용하지 않는 것이다 (None는 불변이므로 내부 목록 OK 임) :

a = [[None]*7 for _ in range(7)] 

예 :

>>> a = [[None]*7 for _ in range(7)] 
>>> a[0][1] = 3 
>>> a 
[[None, 3, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None]] 
+0

고맙습니다. 그것이 문제였습니다. 나는 당신의 제안을 사용하여 그것을 해결했다. – Joker

1

당신 ' 잘못된 목록을 만들었습니다. 당신이 목록을 구성하는 데 사용하는 코드를 보여 주면

중간 항목

모든 그래서 하나가 다른 사람에 반영하는 변화를 야기 업데이트, 동일한 목록에 언급하는 것은

, 내가 어떻게 당신에게 보여줄 수 그것을 해결하기 위해.

또는

l = [sublist[:] for sublist in l] 

당신이