2012-12-06 3 views
3
package main 

import "fmt" 

func main(){ 
    sample := map[string]string{ 
    "key1":"value1", 
    "key2":"value2", 
    "key3":"value3", 
    } 
    for i := 0;i<3;i++{ 
     fmt.Println(sample) 
    } 
} 

위의 코드는 map [string] 문자열을 세 번 인쇄합니다.인쇄 할 때 Go의 맵 반복 순서가 다른 이유는 무엇입니까?

나는 그것은 고정 된 출력에 기대하지만, 다음과 같은 보여줍니다

map[key3:value3 key2:value2 key1:value1] 
map[key1:value1 key3:value3 key2:value2] 
map[key2:value2 key1:value1 key3:value3] 

그것은 다릅니다! 파이썬에서

동안 :

#!/bin/env python 
#encoding=utf8 

sample = { 
    "key1":"value1", 
    "key2":"value2", 
    "key3":"value3", 
} 
for i in range(3): 
    print sample 

출력 :

{'key3': 'value3', 'key2': 'value2', 'key1': 'value1'} 
{'key3': 'value3', 'key2': 'value2', 'key1': 'value1'} 
{'key3': 'value3', 'key2': 'value2', 'key1': 'value1'}` 
+1

원칙적으로 주문은지도에서 보장되지 않으며 Python에서도 보장되지 않으므로지도의 콘텐츠를 인쇄 할 때 고정 출력을 기대해서는 안됩니다. 이것은 아마도 내부 구현 세부 사항 때문일 수 있습니다. 흥미로운 질문. –

+0

@GiulioPiancastelli - 누군가가 Python 3.6의 첫 번째 릴리스 (예 : 지금)와 함께 제공되는 경우 : Python 3.6+ 키워드 인수 및 dicts는 삽입 순서 (참조 C 구현의 시작 부분)를 고려하므로 케이크를 보관할 수 있습니다. 그리고 그것을 너무 먹어 라 ;-) 파이썬 구현에서의 고정 된 순서는 단지 반 고정적이었다 (파이썬 v2에서 해시 충돌을 가진 키는 삽입 순서에 따라 다르게 배치되었다) ... – Dilettant

답변

14

당신은 열쇠를 얻을 것이다 순서에 의존 할 수 없다. 언어 사양 says "지도는 정렬되지 않은 요소 그룹입니다."나중에 "지도상의 반복 순서가 지정되지 않았으므로 하나의 반복에서 다음 반복까지 동일하지 않을 수 있습니다."

3

파이썬은 반복의 순서를 보장하지 않는다, 그러나 당신이 호출 사이에 사전을 수정하지 않는 한 순서가 오랫동안 안정적으로 유지하는 것을 보증 않습니다

If items(), keys(), values(), iteritems(), iterkeys(), and itervalues() are 
called with no intervening modifications to the dictionary, the lists will 
directly correspond. 

이동하거나 보증하지 않습니다. Go의 순서가 안정적 일 수 있고 시작점 만 달라지는 것처럼 보이지만 아무 것도 보증되지 않으므로 귀하의 예에서 보입니다.

6

예, 다양하고 의도적으로 (수정되지 않은지도의 반복은 이전에 안정적이었습니다). 의도는 누군가가 잘못하여 안정적인 반복 보장을 취하는 상황을 가능한 한 빨리 파악하는 것입니다. 또한 맵 구현에 대한 자유도가 추가되어 런타임 라이브러리의 해당 부분에 대한 향후 가능한 최적화가 제공됩니다.

0

논리 순서가 없으므로지도의 반복자 순서에 의존해서는 안된다는 것을 알고 있습니다.

그 외에도 맵 반복을위한 Go의 구현은 의도적으로 무작위로 (http://nathanleclaire.com/blog/2014/04/27/a-surprising-feature-of-golang-that-colored-me-impressed/http://www.confreaks.com/videos/3419-gophercon2014-opening-day-keynote) 코드에서 사람들이이를 사용하지 못하도록하는 것입니다.

도움이 되었기를 바랍니다.

관련 문제