Python中元素顺序的随机种子';设置为列表转换

Python中元素顺序的随机种子';设置为列表转换,python,random,set,Python,Random,Set,我在Jupyter笔记本中执行一些代码,注意到每次运行它时,输出都是不同的,尽管我的程序中没有明确地加入随机性 我把它缩小到一行,从列表中删除所有重复的元素 l = list(set(l)) 我注意到两件事: 如果我在同一个Jupyter内核中重新运行相同的代码,我总是得到相同的l输出,但是 如果我打开另一个笔记本,我会得到不同的输出 是否有某种隐藏的随机种子用于给定内核的set->list转换?它在引擎盖下是如何工作的,如果我想从上述代码中获得确定性输出,我会怎么做?Aset函数几乎与d

我在Jupyter笔记本中执行一些代码,注意到每次运行它时,输出都是不同的,尽管我的程序中没有明确地加入随机性

我把它缩小到一行,从列表中删除所有重复的元素

l = list(set(l))
我注意到两件事:

  • 如果我在同一个Jupyter内核中重新运行相同的代码,我总是得到相同的l输出,但是

  • 如果我打开另一个笔记本,我会得到不同的输出


是否有某种隐藏的随机种子用于给定内核的set->list转换?它在引擎盖下是如何工作的,如果我想从上述代码中获得确定性输出,我会怎么做?

A
set
函数几乎与
dict
相同,以对象的
hash
作为键。大多数对象(在CPython中)的默认
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu散列
函数依赖于它们的
id
,而id又依赖于它们在内存中的地址

新内核意味着对象有不同的地址,这意味着不同的
id
,不同的
散列
,以及集合给出的迭代器的不同顺序

这是依赖于实现的,所以你不能依赖它,我只能说CPython,到目前为止,是这样工作的。你可以依赖的是
set
没有(有效地)排序

如果您需要订购,请保留列表和集合。如果要在保留顺序的同时删除重复,类似的操作将起作用:

def could_add(s, x):
    if x in s:
        return False
    else:
        s.add(x)
        return True

seen = set()
[x for x in l if could_add(seen, x)]

(尽管我完全同意Barmar的意见——如果顺序重要,它们应该是可排序的。)

集合没有排序,为什么您希望得到一致的结果?如果您想要一致的结果,请对列表排序让我困惑的是,行在单个内核中返回一致的结果?另外,我不能使用排序,因为列表中的项目是不同类型的,不可排序。如果它们不可排序,为什么顺序很重要?我想这不是最重要的,只是为了再现性