【问题标题】:Are Python dictionaries literals evaluated in order? [duplicate]是否按顺序评估 Python 字典文字? [复制]
【发布时间】:2016-03-24 04:19:09
【问题描述】:

当我运行它时

import itertools

bar = itertools.count(1).next

print {'a': bar(), 'b': bar(), 'c': bar()}

在 CPython 上,我得到 {'a': 0, 'b': 1, 'c': 2}。这在实施和/或任何地方都有记录吗? a、b 和 c 是否会被乱序赋值?

【问题讨论】:

  • 我不这么认为。考虑到字典键首先不能保证按任何顺序排列,我认为您不能保证解释器构建字典文字的其他内容。不过,这是一个有趣的问题。 不,显然 Python 文档下面的一些答案确实对此做出了规定,尽管这很好。
  • 我不确定它是否总是适合你。也许如果你像在你的例子中那样内联初始化它,它就可以工作。我很确定,如果您创建一个新的 dict 并以相同的顺序分配值,它将不会被保留

标签: python dictionary


【解决方案1】:

您的问题的答案可以在here 找到(我没有足够的声誉将其添加为评论)。

总之,“字典的求值顺序应该和写的一样,但是有一个突出的错误是值在键之前求值。”

【讨论】:

  • 没关系。我的问题是 pairs 是否按顺序评估。
  • 在这里,点个赞,下次可以发表评论。
  • 另一个来自我。
  • 评论级别解锁 - 我看到了光明的日子。谢谢! :)
【解决方案2】:

来自Python Docs(强调我的):

如果给出逗号分隔的键/数据对序列,从左到右评估它们以定义字典的条目:每个键对象都用作字典中的键存储相应的数据......

因此,对总是按顺序评估。但不要对元素的顺序感到困惑。

【讨论】:

    【解决方案3】:

    有趣的问题。一个更好的测试是使用整数,因为它们散列到它们自己的值,并在文字中乱序使用它们,这样你就可以看到它们被评估的顺序。当你这样做时,你会看到:

    >>> print {1: bar(), 3: bar(), 2: bar()}
    {1: 1, 2: 3, 3: 2}
    

    这意味着它们是按从左到右的顺序计算的,即使它们没有按该顺序存储在字典中。

    【讨论】:

    • 这仍然与解释器评估字典文字的顺序无关。
    • 是的:bar() 函数的重点是它返回递增计数器,它显示了它被调用的顺序。这里我们看到首先调用了 1,然后是 3,然后是 2,所以文字是从左到右计算的。
    • 我现在明白了,感谢您的澄清。
    猜你喜欢
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多