2012-03-05 3 views

답변

6

, 당신은 고려해야한다. 위의 예에서

>>> 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 기본 제공 개체는 모두 동일한 값을 반환 함) 개체의 새 상태가 목록의 모든 요소에 대해 표시됩니다.

따라서이 문제는 원하지 않으므로 중첩 된 루프에서 필요한 목록을 만들어 목록의 모든 요소가 가능한 다른 개체를 가리키는 지 확인해야합니다 부작용으로 목록의 다른 요소의 상태를 변경하지 않고 수정하십시오.

3

같은 목록에 대한 참조 번호는 rad입니다. 그 중 하나에서 요소를 변경하면 동일한 목록이므로 요소 모두에서 변경됩니다. 곱셈 연산자를 사용하여 목록을 만들 때 생성되는 객체가 변경 가능한 inmutable 경우

[[0 for x in range(rad)] for y in range(rad)] 
+0

실제로 'for'는 여기에 하나만 있으면됩니다 :'[[0] * rad for _ range (rad)] ' – georg

+0

'0 '이 불변이므로. 그러나 그것은 명백한 것이 결코 아프지 않습니다. –

관련 문제