添加1后python字典结果发生变化

时间:2016-03-09 04:50:51

标签: python dictionary

我创建了一个函数来计算字符串在列表中出现的次数并返回一个字典。我让程序工作,但有趣的是,当我更改键值d [i]的值时,名称的顺序发生了变化。为什么python会这样做?

之前:

def countlist(l):
    d = {}
    for i in l:
        if i not in d:
            d[i] = 0
        else:
            d[i] += 1
    return d

输入:

countlist(['helen','andrew','chris','chris','helen'])

结果:

{'helen': 1, 'andrew': 0, 'chris': 1}

后:

def countlist(l):
    d = {}
    for i in l:
        if i not in d:
            d[i] = 1
        else:
            d[i] += 1
    return d

输入:countlist(['helen','andrew','chris','chris','helen'])

结果:{'andrew': 1, 'chris': 2, 'helen': 2}

1 个答案:

答案 0 :(得分:1)

您是否在Python的不同会话中执行此代码?如果是这样,字符串键的哈希码可能会改变。为了防止因故意提交具有冲突哈希的密钥而导致的拒绝服务攻击,Python盐哈希为strbytes和其他“数据字符串”类型。

Per the docs

  

请注意

     

默认情况下,str,bytes和datetime对象的__hash__()值使用不可预测的随机值“加盐”。尽管它们在单个Python进程中保持不变,但在重复调用Python之间无法预测它们。

     

这旨在提供针对由精心选择的输入引起的拒绝服务的保护,该输入利用dict插入的最坏情况性能,O(n ^ 2)复杂度。有关详细信息,请参阅http://www.ocert.org/advisories/ocert-2011-003.html

     

更改散列值会影响dicts,集和其他映射的迭代顺序。 Python从未对这种排序做出保证(通常在32位和64位版本之间有所不同)。

     

另见PYTHONHASHSEED

如果您需要根据广告订单重复排序,请使用collections.OrderedDict