【问题标题】:Does the order of keys in dictionary.keys() in a python dictionary change if the values are changed?如果值更改,python 字典中 dictionary.keys() 中键的顺序是否会更改?
【发布时间】:2013-06-04 02:20:20
【问题描述】:

我有一个 python 字典(比如 dict),我在其中不断修改值(键保持不变)。当我修改键对应的值时,dict.keys()给出的列表中键的顺序会改变吗?

【问题讨论】:

  • “修改值”是指为键分配新值(例如,d['key'] = newVal)还是改变现有值对象(例如,d['key'].append(1))?
  • 顺序,一旦设置不变。但是,dicts 没有存储密钥的顺序
  • 我同时做这两件事,分配一个新值,然后改变它。
  • 即使订单看起来没有改变,也不应该依赖它。您看到的行为是实现的副作用。 Jython、pypy 等的行为可能不同。为了保证订单的严格保存,您应该考虑使用 OrderedDict。
  • 你需要一个有序的字典,还是你只是想知道?您要解决的实际问题是什么?

标签: python dictionary


【解决方案1】:

不,python 字典对键进行排序,但不保证该顺序是什么或如何计算。
这就是为什么它们不能保证首先被订购的原因。
存储在字典中的值对键的哈希值没有影响,因此不会改变顺序。

取自Python Documentation

字典对象的 keys() 方法返回字典中使用的所有键的列表,按任意顺序(如果要对其进行排序,只需对其应用 sorted() 函数)。要检查单个键是否在字典中,请使用 in 关键字。

【讨论】:

    【解决方案2】:

    不,dict 的顺序不会因为您更改值而改变。顺序仅取决于键(或它们的哈希值,至少在 CPython 中更具体)。但是,它可能会在 Python 的版本和实现之间发生变化,并且在 Python 3.3 中,每次启动 Python 时都会发生变化。

    【讨论】:

      【解决方案3】:

      不应假定 Python 字典的键顺序是恒定的。

      但是,还有其他数据结构可以提供一致的键顺序,它们的工作原理很像字典:

      http://stromberg.dnsalias.org/~strombrg/treap/

      http://stromberg.dnsalias.org/~strombrg/red-black-tree-mod/

      顺便说一句,您不应该将变量命名为“dict”,因为有一个名为“dict”的内置类型将变得不可见。

      【讨论】:

        猜你喜欢
        • 2014-05-05
        • 2022-07-12
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 2022-08-03
        • 2017-02-03
        • 2021-09-07
        • 1970-01-01
        相关资源
        最近更新 更多