我喜欢使用字典作为switch状态的一种形式,通过设置布尔作为键。示例:
>>> def f(a):
...      return {True: -a, a==0: 0, a > 0: a}[True]
... 
>>> f(-3)
3
>>> f(3)
3
>>> f(0)
0键True作为else/default的情况工作,只有在没有其他键被计算到True时才返回。我猜这假设了某种迭代字典的计算顺序。
现在查看最新版本的分支2.6、2.7、3.1和3.2的最新Python团队发布公告摘录:
散列随机化会导致dicts和set的迭代顺序不可预测,并且在Python运行期间有所不同。Python从来没有保证在dict或set中迭代键的顺序,并且建议应用程序永远不要依赖它。从历史上看,dict迭代顺序在不同版本之间变化不大,并且在Python的连续执行之间始终保持一致。因此,一些现有的应用程序可能依赖于dict或set排序。
这是否意味着不再可能使用dicts作为交换机调用?或者我应该使用其他类(比如OrderedDict之类的)?或者我完全离开了这不应该影响到这一切?
发布于 2012-04-17 08:00:54
你误解了这段代码的工作原理。
您的字典只有两个键:True和False。True键可能有多个相互冲突的值,但在字典初始化时就会解决。
字典查找没有迭代。
发布于 2012-04-17 08:00:56
散列随机化不会影响您的应用程序。它应该只影响依赖字典中键的迭代顺序的应用程序。
尽管如此,我发现您的技术比简单的if..elif链更晦涩,效率也更低(构建一个新的dict并不便宜)。
发布于 2012-04-17 08:00:16
使用字典散列条件的方式不会受到排序的影响。您严格使用键来访问字典,排序对您来说并不重要,因为您没有对键/值进行迭代。因此,您对字典的特定用法不受Python字典散列随机化的影响。
https://stackoverflow.com/questions/10187288
复制相似问题