Python之为啥将已经排过序的列表装成集合会乱序?

Python之为啥将已经排过序的列表装成集合会乱序?

原码
def __init__(self, seq=()): # known special case of set.__init__
    """
    set() -> new empty set object
    set(iterable) -> new set object
    
    Build an unordered collection of unique elements.
    # (copied from class doc)
    """
    pass
  • 通过搜索资料直到,底层原理是分别调用Hash算法和equal方法
    • 每传入一个元素,计算对应的hash值,hash值不同就确定是不同的,直接尾部添加
    • 如果传入的元素的hash值是相同的,那就调用equal方法,直接比对hash值相同的两个变量是否相同

问题

  • 既然是计算hash值,那么如果hash值不同,是否就在集合的末位添加,如果hash值相同但是不是同一个数据,是否就在hash值相同数据周边添加,不在尾部添加

  • 查询,set类的add()原理

  • 并没有查到,API中仅仅讲述了set并不记录位置和插入顺序,个人认为是按照hash值来插入的

解决方式——了解set中的hash值计算算法,通过比较hash值和插入位置来判定结论是否正确

aset = {1,78}
print(aset)
print(hash('96'))
print(hash('78'))
print(hash('1'))
aset.add(96)
print(aset)

结果

Python之为啥将已经排过序的列表装成集合会乱序?_第1张图片

结论

  • 首先根绝结果来看,联系并不怎么大,但是本次实验本身就有问题,我直接输入整形的数字,对应的hash值就是对应的数字,一点关系都没有
  • 揣测为str型,但是也不是很相关。
  • 总之添加确实是有顺序的,我还是比较坚信是和set内部函数的hash值计算有关,但是找不到相关的算法

你可能感兴趣的:(python)