2012-04-14 4 views
1

파이썬에서 2 차원 배열의 초기화가이 링크입니다 : How to implement this C++ source in python?어제 2 차원 배열을 초기화에 대해 질문을

대답에 문제가 있습니다, 친구가하는 방법을 언급 :

나는이 변경 될 때
G = [[0]*11]*11 

그러나이 방법으로 , 2G[0][0]는 모든 G[i][0](0<=i<11)2 모든 변화는,하지만 난 이유를 모르겠어 것인가?

보충 : 0 또는 다른 번호가 immutable, 그래서 우리는 그들 중 하나가, 나머지는 변경되지 않습니다 변경 :

이 내가 생각했던 것입니다. [0, 0, 0, .....] 목록은 mutable이므로 우리 [0, 0, ...] * 11 일 때 모든 [0, 0, ...] 목록은 같은, is 함수는 True입니다. 내가 맞습니까?

답변

4

동일한 목록에 11 개의 참조가 있으므로

G = [[0] * 11 for x in range(11)] 
+0

나는 quetion에 보충 물을 넣는다. 맞습니까? –

+0

귀하의 결론은 정확합니다. –

2

*11 표기법은 동일한 객체에 대해 11 개의 참조를 만듭니다. 객체를 변경할 수 없으므로 객체를 변경할 수 없으므로 다른 객체에 대한 참조가 변경되므로 알 수 없습니다. 객체가 변경 가능하면 목록의 멤버에게 할당하는 등 수정할 수 있습니다. 모든 참조가 동일한 객체에 대한 것이므로 모든 객체가 동시에 수정됩니다.

변경 가능/변경 불가능한 것으로 변경 될 수 있지만 그렇지 않습니다 - Python은 두 경우 모두 일관성이 있습니다. 다음 예제를 고려하십시오.

G[0] = [3]*11 

G [1]이 변경되지 않은 것을 확인할 수 있습니다.

+0

죄송합니다, "변경 가능/변경 불가능한 일이 바뀌는 것처럼 보일 수도 있지만, 그렇지 않습니다 - 파이썬은 두 경우 모두 일관성이 있습니다"라는 의미입니까? 왜 "모든 참조가 같은 객체에 있기 때문에 모든 객체가 동시에 수정됩니다" –

관련 문제