, 당신은 고려해야한다. 위의 예에서
>>> l = [0] * 3
>>> l
[0, 0, 0]
>>> map(id, l)
[42383312, 42383312, 42383312]
>>> l[0] += 1
>>> l
[1, 0, 0]
>>> map(id, l)
[42383288, 42383312, 42383312]
이 목록은 모두 (이 판정 같은 객체를 가리키는 세 요소를 가지고 파이썬 정수에서
는 산술 연산 이후에, 새로운 객체가 생성되고, inmutables있다 id
내장을 사용). 그러나 첫 번째 요소가 수정되면이 요소는 다른 다른 개체를 가리키고 변경 사항은 목록의 다른 요소에 영향을 미치지 않습니다.
한편
, 오브젝트는 변경 가능한 경우, 당신은 수정 목록에있는 모든 개체에 적용하는 것처럼입니다 얻을 장소에서 개체를 수정하는 방법, 결과 사용할 때 :
>>> l = [[0]] * 3
>>> l
[[0], [0], [0]]
>>> map(id, l)
[48544944, 48544944, 48544944]
>>> l[0].append(0)
>>> l
[[0, 0], [0, 0], [0, 0]]
>>> map(id, l)
[48544944, 48544944, 48544944]
을
이 예제에서는 append
메서드를 호출 한 후 앞의 예제 에서처럼 새 개체를 만들지 않았습니다. 목록의 모든 요소가 동일한 개체를 가리키는 경우 (즉, id
기본 제공 개체는 모두 동일한 값을 반환 함) 개체의 새 상태가 목록의 모든 요소에 대해 표시됩니다.
따라서이 문제는 원하지 않으므로 중첩 된 루프에서 필요한 목록을 만들어 목록의 모든 요소가 가능한 다른 개체를 가리키는 지 확인해야합니다 부작용으로 목록의 다른 요소의 상태를 변경하지 않고 수정하십시오.
실제로 'for'는 여기에 하나만 있으면됩니다 :'[[0] * rad for _ range (rad)] ' – georg
'0 '이 불변이므로. 그러나 그것은 명백한 것이 결코 아프지 않습니다. –