为了账号安全,请及时绑定邮箱和手机立即绑定

为什么打印时Go的地图迭代顺序会有所不同?

为什么打印时Go的地图迭代顺序会有所不同?

Go
阿波罗的战车 2021-05-18 17:16:24
package mainimport "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三次。我希望它具有固定的输出,但它显示如下: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=utf8sample = {    "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'}`
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

您不能依靠获得密钥的顺序。语言规范“映射是一组无序的元素”,后来又说“未指定映射的迭代顺序,并且不能保证每次迭代之间都相同。”


查看完整回答
反对 回复 2021-05-24
?
ibeautiful

TA贡献1993条经验 获得超5个赞

是的,它是变化的,甚至是有意的(未经修改的地图的迭代之前一直很稳定)。目的是尽早发现有人错误地假设了稳定的迭代保证的情况。此外,由于增加了实现地图的自由度,因此可以对运行时库的该部分进行更多的将来优化。


查看完整回答
反对 回复 2021-05-24
?
湖上湖

TA贡献2003条经验 获得超2个赞

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中的顺序可能是稳定的,只是起点有所不同,但是由于没有任何保证,因此请不要依赖它。


查看完整回答
反对 回复 2021-05-24
  • 3 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信