为什么打印时Go的地图迭代顺序有所不同?(Why does Go's map iterati

2019-07-04 16:21发布

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[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'}`

Answer 1:

你不能指望在其中,你会拿到钥匙的顺序。 语言规范说 “A图是元素的无序基”,以及后来的“未指定的迭代顺序在地图中,并且不保证是从一次迭代相同的到下一个”。



Answer 2:

是的,它改变,甚至故意(非修改地图的迭代以前一直保持稳定)。 这样做的目的是为了尽可能早地当有人错误地假设在一个稳定的迭代担保的情况赶上。 此外,与地图实现更多自由总会有运行时库的那部分更可能的未来优化。



Answer 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不保证无论是。 它从你的例子看起来好像围棋的顺序可能是稳定的,只有起点不同,但如无保证不依赖于它。



Answer 4:

据我所知,你不应该依赖于迭代器地图的顺序,因为它没有逻辑顺序。

这且不说,相信Go的实现在地图迭代是有意随机( http://nathanleclaire.com/blog/2014/04/27/a-surprising-feature-of-golang-that-c​​olored-me-impressed/和http://www.confreaks.com/videos/3419-gophercon2014-opening-day-keynote )是从在他们的代码依赖于它的人望而却步。

我希望帮助。



文章来源: Why does Go's map iteration order vary when printing?
标签: python map go