Python 设定是否确定?
当你阅读这些问题时,如你所看到的备注,顺序是不能保留的 这是可以理解的。困扰我的是它走得更远——正如我所看到的,执行甚至不是确定性的,即:Python 设定是否确定?,python,Python,当你阅读这些问题时,如你所看到的备注,顺序是不能保留的 这是可以理解的。困扰我的是它走得更远——正如我所看到的,执行甚至不是确定性的,即: list(set(values_list)) 我会得到唯一的值,问题是每次运行结果的顺序不同。因此这意味着集(构造函数或枚举器)不是确定性的 我想知道这是怎么发生的?我看不出为什么在单线程执行(?)时会出现非确定性行为 当然,可以对结果进行排序以强制执行确定性行为,但一旦您观察到手头有非确定性代码,就可以得到这样的想法 更新: 我的代码的精髓——该文件是一
list(set(values_list))
我会得到唯一的值,问题是每次运行结果的顺序不同。因此这意味着集
(构造函数或枚举器)不是确定性的
我想知道这是怎么发生的?我看不出为什么在单线程执行(?)时会出现非确定性行为
当然,可以对结果进行排序以强制执行确定性行为,但一旦您观察到手头有非确定性代码,就可以得到这样的想法
更新:
我的代码的精髓——该文件是一个包含10000个字符串(具有3个唯一值)的数组的pickle
每次跑步我都会得到不同的顺序。哦,我使用的是Python 3.6.4。到目前为止,我还没有看到这个问题:
>>> values_list = range(100) * 3
>>> a = list(set(values_list))
>>> b = list(set(values_list))
>>> a == b
True
>>>
到目前为止,我没有发现这个问题:
>>> values_list = range(100) * 3
>>> a = list(set(values_list))
>>> b = list(set(values_list))
>>> a == b
True
>>>
集合是无序的。因此,将集合转换为列表并不能保证每次都有相同的结果。要澄清的是,这个问题:“为什么集合构造函数是非确定性的?”@mkrieger1但这并不意味着每次都是随机的。除非是:你能举个例子吗?当我尝试时,
list(set(values))
总是以相同的顺序进行游戏(用随机数列表测试,都是3.6和2.7)@Joel,因为答案同样适用于dicts和set。set是无序的。因此,将集合转换为列表并不能保证每次都有相同的结果。要澄清的是,这个问题:“为什么集合构造函数是非确定性的?”@mkrieger1但这并不意味着每次都是随机的。除非是:你能举个例子吗?当我尝试时,list(set(values))
总是以相同的顺序进行游戏(用随机数列表测试,分别为3.6和2.7)@Joel,因为答案同样适用于dicts和set。这是巧合。“我连续两次得到相同的结果”不是确定性行为的证明。在什么版本的Python上…?@deceze OP没有指定任何特定的版本,但指定了版本。这是巧合。“我连续两次得到相同的结果”不是确定性行为的证明。在什么版本的Python上…?@deceze OP没有指定任何特定的版本,而是指定了版本。