복붙노트

[PYTHON] 한 목록의 요소를 변경하면 여러 목록이 변경됩니다. [중복]

PYTHON

한 목록의 요소를 변경하면 여러 목록이 변경됩니다. [중복]

목록 목록에 mysolution이라고 써 있습니다.

>>>mySolution
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> mySolution[0][0] = 1    
>>> mySolution
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]

의도 된 결과 :

[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

목록의 제 목록에있는 모든 요소가 1로 변경되는 이유는 무엇입니까? 첫 번째 목록의 첫 번째 요소를 1로 변경하고 싶습니다.

해결법

  1. ==============================

    1.중요한 것은 원래의 mysolution 목록을 만든 방법입니다. 보이는 것처럼 4 번 같은 목록이 포함되어 있으므로 한 번 변경하면 4 가지 위치 모두에서 변경됩니다.

    중요한 것은 원래의 mysolution 목록을 만든 방법입니다. 보이는 것처럼 4 번 같은 목록이 포함되어 있으므로 한 번 변경하면 4 가지 위치 모두에서 변경됩니다.

    이와 같이 독립적 인 0으로 채워진 목록을 초기화하려면 다음을 수행 할 수 있습니다.

    mysolution = [[0] * 4 for i in range(4)]
    
  2. ==============================

    2.다음과 같이 목록을 작성했을 가능성이 큽니다.

    다음과 같이 목록을 작성했을 가능성이 큽니다.

    mySolution = [0]*4
    mySolution = [mySolution]*4
    

    또는 동등하게 :

    mySolution = [[0]*4]*4
    

    위의 스 니펫 중 하나는 동일한 하위 목록의 사본 인 4 개의 하위 목록으로 된 목록을 작성하므로 하나의 하위 목록에 대한 수정 사항은 다른 하위 목록에 반영됩니다. 둘은 동일하고 동일합니다. 해결책은 네 가지 하위 목록을 만드는 것입니다.

    mySolution = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
    

    또는 조금 더 짧습니다.

    mySolution = [[0]*4 for _ in xrange(4)]
    
  3. ==============================

    3.모든 포함 된 목록은 실제로 동일한 목록이므로 할 일 :

    모든 포함 된 목록은 실제로 동일한 목록이므로 할 일 :

    l = [0, 0, 0, 0]
    my_solution = [l, l, l]
    

    그런 다음 my_solution [0], my_solution [1] 및 my_solution [2]는 동일한 객체 (l)에 대한 참조입니다.

    한 위치에서 목록을 수정하면 모든 위치가 변경됩니다. 왜냐하면 목록은 변경 가능한 객체이기 때문입니다.

    대신 여러 목록을 사용하십시오.

    l1 = [0, 0, 0, 0]
    l2 = [0, 0, 0, 0]
    l3 = [0, 0, 0, 0]
    my_solution = [l1, l2, l3]
    

    어떤 의도로 작동합니다.

  4. ==============================

    4.이 일이 잘되고 있음에 유의하십시오.

    이 일이 잘되고 있음에 유의하십시오.

    mySolution = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
    mySolution[0][0] = 1    
    print mySolution
    
    >>> 
    [[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
    

    그것은 모두 솔루션을 어떻게 초기화 했느냐에 달려 있습니다. 이

    mySolution = [[0, 0, 0, 0]]*4
    mySolution[0][0] = 1    
    print mySolution
    

    주는

    >>> 
    [[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
    >>> 
    

    왜냐하면 mySolution의 각 배열 [0, 0, 0, 0]은 [[0, 0, 0, 0]] * 4의 초기화 배열 [0, 0, 0, 0]의 복사본이기 때문입니다. 첫 번째 배열의 첫 번째 요소를 변경하면 해당 배열의 복사본도 변경됩니다.

    이 초기화 mySolution = [범위 (4)의 x에 대한 [0, 0, 0, 0]] 당신은 배열을 복사하지 않고 [0,0,0,0]을 4 번 더하여 예상 한 결과를 제공합니다 .

  5. from https://stackoverflow.com/questions/18946728/changing-an-element-in-one-list-changes-multiple-lists by cc-by-sa and MIT license