【发布时间】:2016-04-09 23:53:42
【问题描述】:
采用可散列对象(例如dict 键或set 项)的容器。因此,字典只能有一个值为 1、1.0 或 True 等的键(注意:稍微简化 - 允许哈希冲突,但这些值被认为是相等的)
我的问题是:解析顺序是否明确定义,生成的对象是否可跨实现预测?例如,OSX Python 2.7.11 和 3.5.1 像这样解释dict:
>>> { True: 'a', 1: 'b', 1.0: 'c', (1+0j): 'd' }
{True: 'd'}
在这种情况下,似乎保留了第一个键和最后一个值。
类似,在set的情况下:
>>> { True, 1, 1.0, (1+0j) }
set([(1+0j)])
这里似乎保留了最后一个项。
但是(如 cmets 中所述):
>>> set([True, 1, 1.0])
set([True])
现在迭代中的第一个被保留。
文档指出项目的顺序(例如在dict.items 中)是未定义的,但是我的问题是指构造 dict 或set 对象的结果。
【问题讨论】:
-
但请注意
set([ True, 1, 1.0, (1+0j) ])给出set([True]) -
你是在严格地谈论 dict 和 set 字面量吗?
-
@TomKarzes 啊,这很有趣。将在上面添加。
-
@PadraicCunningham 不严格,不。更重要的是:这种行为是否已定义且一致。
-
@Padraic 文档说集合文字是“从左到右评估并添加到集合对象”。但我们所看到的却恰恰相反:它们是使用
{}表示法从右到左添加的集合。请记住,添加的第一个值是保留的值。
标签: python dictionary set python-internals