字典在Python 3.6中排序(至少在CPython实现下),与之前的版本不同.这似乎是一个重大变化,但它只是文档中的一小段.它被描述为CPython实现细节而不是语言特性,但也暗示这可能成为未来的标准.
在保留元素顺序的同时,新字典实现如何比旧字典实现更好?
以下是文档中的文字:
dict()现在使用PyPy开创的"紧凑"表示.与Python 3.5相比,新dict()的内存使用量减少了20%到25%.PEP 468(在函数中保留**kwargs的顺序.)由此实现.这个新实现的顺序保留方面被认为是一个实现细节,不应该依赖(这可能会在未来发生变化,但是在更改语言规范之前,希望在几种版本的语言中使用这个新的dict实现为所有当前和未来的Python实现强制命令保留语义;这也有助于保持与随机迭代顺序仍然有效的语言的旧版本的向后兼容性,例如Python 3.5).(由INADA Naoki在issue 27350中提供.最初由Raymond Hettinger提出的想法.)
2017年12月更新:Python 3.7 保证了dict保留插入顺序
我想它可能是类似的collections.namedtuple,但这更像是一个冻结的词典(一个半冻结的词典).不是吗?
A"frozendict"应该是一个冰冻的字典,它应该有keys,values,get,等,并支持in,for等等.
由于dictPython 3.6 中的实现发生了变化,现在默认排序.现在还set保留秩序吗?
我找不到任何关于它的信息,但由于这两种数据结构在它们工作的方式非常相似,我认为可能就是这种情况.
我知道dict在所有情况下都无法订购s,但它们大多数情况下都是如此.如Python文档中所述:
这个新实现的顺序保留方面被认为是一个实现细节,不应该依赖它
我需要实现一个hashable dict,所以我可以使用字典作为另一个字典的键.
几个月前我使用了这个实现:Python hashable dicts
但是我收到一位同事的通知说"这不是真的不可变,因此不安全.你可以使用它,但它确实让我感觉像一个悲伤的熊猫'.
所以我开始四处寻找创造一个不可变的东西.我没有必要将'key-dict'与另一个'key-dict'进行比较.它唯一的用途是作为另一个字典的关键.
我想出了以下内容:
class HashableDict(dict):
"""Hashable dict that can be used as a key in other dictionaries"""
def __new__(self, *args, **kwargs):
# create a new local dict, that will be used by the HashableDictBase closure class
immutableDict = dict(*args, **kwargs)
class HashableDictBase(object):
"""Hashable dict that can be used as a key in other dictionaries. This is now immutable"""
def __key(self):
"""Return a tuple of the current keys"""
return tuple((k, immutableDict[k]) for k in sorted(immutableDict)) …Run Code Online (Sandbox Code Playgroud) 简短版本:什么是覆盖dict.keys()和朋友的最佳方式,以防止我在Python 3中意外修改我的(据称)不可变字典?
在最近的一个问题中,我询问了如何在Python中散列不可变字典.从那时起,我已经建立了一个我不满意的不可改变,可以翻译的字典.但是,我意识到它有一个孔:在字典视图由归国keys(),items()和values()仍然让自己偶然突变我(据说)不变的字典.
关于字典视图的Stack Overflow唯一的问题是Python创建自己的字典子集dict视图,但这似乎与我的问题没什么关系,以及"冻结字典"的答案是什么?似乎没有进入压倒keys()等等
这样做会阻止我意外修改,例如,我的不可变字典的键吗?
class FrozenCounter(collections.Counter):
"Model an hashable multiset as an immutable dictionary."
# ...
def keys(self):
return list(super().keys())
def values(self):
return list(super().values())
def items(self):
return list(super().items())
Run Code Online (Sandbox Code Playgroud)
我主要看不懂.
dictviews无法修改dicts.在Python 3文档中,我误读了"它们提供了对字典条目的动态视图,这意味着当字典发生更改时,视图会反映这些更改","当视图发生更改时,字典会反映这些更改." 显然,这不是文件所说的.
我想subclass dict在python中使子类的所有字典都是不可变的.
我不明白如何__hash__影响不变性,因为在我的理解中它只是表示对象的相等或不相等!
那么,可以__hash__用来实现不变性吗?怎么样 ?
更新:
目标是来自API的常见响应可用作dict,必须作为全局变量共享.那么,无论如何都需要完好无损?
python ×6
dictionary ×3
immutability ×3
python-3.6 ×2
python-3.x ×2
class ×1
cpython ×1
set ×1
subclass ×1