2012-01-26 4 views
3

나는 보이는 파이썬에서 코드를 작성 같은 : 나는 maplist 인쇄이상한 파이썬 행동

maplist=[{}]*11 
mylist=[0]*11 
maplist[0]['this']=1 
print maplist 

출력은 다음과 같습니다 예상

[{'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}] 

은 다음과 같습니다

[{'this': 1}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}] 

보다는 목록의 첫 번째 요소 만지도에이 키가 있어야합니다. 이 문제의 원인은 무엇입니까?

+0

그것은 놀라운 일을 내가 시작 해요 우리는 태그 별 FAQ를 만드는 방법이 필요하다고 생각합니다. –

답변

12

당신이 다음 작업을 수행 할 때 :

maplist=[{}]*11 

같은 사전 11 개의 참조와 끝까지. 즉, 하나의 사전을 수정하면 모두 변경된 것처럼 보입니다. 그대로 0 스칼라이기 때문에, 다음 줄은 괜찮

maplist=[{} for in xrange(11)] 

참고 :

mylist=[0]*11 
+0

Ohh가 처음으로 이것을 보았습니다. 파이썬이 그렇게하는 특별한 이유가 있습니까? 유용할까요? –

+0

@Piyush 목록에 * 연산자가 작동하는 방식의 결과 일뿐입니다. 더 자세한 설명은 [이 답변] (http://stackoverflow.com/a/8240157/566644)을 참조하십시오. –

3

문제는 당신이 입력 할 때입니다 해결하기 위해

이와 그 라인을 대체

maplist=[{}]*11 

는 동일한 dict 11 참조 목록을 작성하고 있습니다. 하나의 사전 만 생성됩니다.

이 같은 것을 할 수있는 11 별도의 사전 만들려면 : 우리는 중복으로 일을 표시에 같은 질문에 미묘한 변화 ... 추가를 얼마나 자주

>>> maplist = [{} for i in range(11)] 
>>> maplist[0]['this'] = 1 
>>> maplist 
[{'this': 1}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]