如何强制python是可复制的?

如何强制python是可复制的?,python,debugging,Python,Debugging,我正在调试python代码,惊讶地发现它并不总是产生相同的输出。具体地说,在某个时刻,我从一个集合中选择一个随机元素,将它转换为一个列表,并获取第一个元素,但我并不总是得到相同的元素 此代码说明了该行为 class Foo(): def __init__(self,n): self.n = n } def __repr__(self): return "<{}>".format(self.n) print(list(set(Foo(i

我正在调试python代码,惊讶地发现它并不总是产生相同的输出。具体地说,在某个时刻,我从一个集合中选择一个随机元素,将它转换为一个列表,并获取第一个元素,但我并不总是得到相同的元素

此代码说明了该行为

class Foo():
    def __init__(self,n):
        self.n = n
}
    def __repr__(self):
        return "<{}>".format(self.n)

print(list(set(Foo(i) for i in (1,2,3))))'''

It sometimes produces [<3>, <1>, <2>] and sometimes [<1>, <2>, <3>]
class Foo():
定义初始化(self,n):
self.n=n
}
定义报告(自我):
返回“”格式(self.n)
打印(列表(在(1,2,3)中为i设置Foo(i))“”)
它有时产生[,],有时产生[,]
我已尝试在执行前调用random.seed(0),但这没有效果

这并不相关,但在我的实际问题中,我通过反复选择一个未处理的节点并从该节点进行泛洪填充,将一个图拆分为连接的组件。我的代码选择随机节点来启动进程,因此组件以不同的顺序计算,这使得调试代码更加困难,组件的工作方式和顺序可能会有所不同


我知道,在选择列表中的第一个节点之前,我可以通过对节点列表进行排序来强制实现可再现性,但这会带来不必要的开销。我是否天真地认为计算机语言的一个基本原则是,它在相同的输入上应该始终表现相同?

如果您使用
random
模块,您可以通过调用具有特定值的函数来初始化它,迫使它始终生成相同的伪随机值序列

我通常使用
random.seed(42)
,但其他一些值也可以


这很有用,因为它通常使测试更容易。

如果您使用的是
随机
模块,您可以通过调用具有特定值的函数来初始化它,从而强制它始终生成相同的伪随机值序列

我通常使用
random.seed(42)
,但其他一些值也可以


这很有用,因为它通常使测试更容易。

集合不区分顺序。“不要用螺丝刀钉钉子”@snakecharmerb:你甚至不需要任何特别的东西-你可以使用
OrderedDict
和一个虚拟值作为有序集。谢谢你,Karl,我的问题最有用的答案是使用“PYTHONHASHSEED=0 python3/tmp/foo.py”集合不使用garantize顺序。“不要用螺丝刀钉钉子”@snakecharmerb:你甚至不需要任何特别的东西-你可以使用
OrderedDict
和一个虚拟值作为有序集。谢谢你,Karl,我的问题最有用的答案是使用“PYTHONHASHSEED=0 python3/tmp/foo.py”