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)
    }
}

上記の go コードは、map[string]string を 3 回出力するだけです。

出力が固定されることを期待していますが、次のように表示されます。

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

それは異なります!

Pythonの場合:

#!/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'}`
4

4 に答える 4

15

キーを取得する順序に依存することはできません。言語仕様に、「マップは要素の順序付けされていないグループです」と記載されており、後で「マップの反復順序は指定されておらず、反復ごとに同じであることが保証されていません。」

于 2012-12-06T13:53:13.727 に答える
6

はい、それは変化し、意図的にさえも変化します(変更されていないマップの反復は以前は安定していました)。意図は、誰かが誤って安定した反復保証を想定している状況をできるだけ早くキャッ​​チすることです。さらに、マップ実装の自由度が増すと、ランタイムライブラリのその部分の将来の最適化がさらに可能になります。

于 2012-12-06T14:12:15.863 に答える
3

Python は反復の順序を保証しませんが、呼び出し間で辞書を変更しない限り、順序が安定することを保証します。

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

Goも保証しません。あなたの例から、Goの順序は安定していて、開始点のみが変化しているように見えますが、何も保証されていないため、それに依存しないでください。

于 2012-12-06T14:06:16.310 に答える