Is python's “set” stable?

后端 未结 7 1101
渐次进展
渐次进展 2020-11-29 07:21

The question arose when answering to another SO question (there).

When I iterate several times over a python set (without changing it between calls), can I assume it

7条回答
  •  攒了一身酷
    2020-11-29 08:10

    The answer is simply a NO.

    Python set operation is NOT stable.

    I did a simple experiment to show this.

    The code:

    import random
    random.seed(1)
    
    x=[]
    class aaa(object):
        def __init__(self,a,b):
            self.a=a
            self.b=b
    
    for i in range(5):
        x.append(aaa(random.choice('asf'),random.randint(1,4000)))
    
    for j in x:
        print(j.a,j.b)
    
    print('====')
    for j in set(x):
        print(j.a,j.b)
    

    Run this for twice, you will get this:

    First time result:

    a 2332
    a 1045
    a 2030
    s 1935
    f 1555
    ====
    a 2030
    a 2332
    f 1555
    a 1045
    s 1935
    
    Process finished with exit code 0
    

    Second time result:

    a 2332
    a 1045
    a 2030
    s 1935
    f 1555
    ====
    s 1935
    a 2332
    a 1045
    f 1555
    a 2030
    
    Process finished with exit code 0
    

    The reason is explained in comments in this answer.

    However, there are some ways to make it stable:

    • set PYTHONHASHSEED to 0, see details here, here and here.

    • Use OrderedDict instead.

提交回复
热议问题