Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python设置了意外的行为_Python_Set - Fatal编程技术网

python设置了意外的行为

python设置了意外的行为,python,set,Python,Set,我试图修复一个在AWS上运行良好但在GCP上失败的测试 出于某种原因,GCP改变了查询结果的顺序,所以我决定比较集合 该列表只包含两个项目,正如您所看到的,它们是相同的,但在比较列表时,它表示它们不是 received_devices Out[49]: [(1L, u'1', None, u'test_device_1'), (2L, u'2', None, u'test_device_2')] expected_devices Out[50]: [(2, '2', None, 'test_de

我试图修复一个在AWS上运行良好但在GCP上失败的测试

出于某种原因,GCP改变了查询结果的顺序,所以我决定比较集合

该列表只包含两个项目,正如您所看到的,它们是相同的,但在比较列表时,它表示它们不是

received_devices
Out[49]: [(1L, u'1', None, u'test_device_1'), (2L, u'2', None, u'test_device_2')]
expected_devices
Out[50]: [(2, '2', None, 'test_device_2'), (1, '1', None, 'test_device_1')]
received_devices[0] == expected_devices[1]
Out[51]: True
received_devices[1] == expected_devices[0]
Out[52]: True
set(received_devices) == set(expected_devices)
Out[53]: False
{(1L, u'1', None, u'test_device_1'), (2L, u'2', None, u'test_device_2')} == {(2, '2', None, 'test_device_2'), (1, '1', None, 'test_device_1')}
Out[57]: True
[expected_devices[0], expected_devices[1]] == [received_devices[1], received_devices[0]]
Out[60]: True


为什么会发生这种情况?

您的主要问题或困惑与集合比较的行为有关。集合在概念上是无序的,因此当比较两个集合时,Python会忽略仅与数据存储顺序相关的差异(这可能会有所不同,具体取决于集合的创建方式)

这与列表大不相同,列表根据内容的顺序按字典顺序进行比较

print([1, 2, 3, 4] == [3, 4, 2, 1]) # prints False because order matters to lists
代码中有一个次要问题实际上并没有在这里引起问题,但它看起来有点可能,而且这是一件坏事,以后可能会引起其他问题。事实上,您正在混合使用Unicode和字节字符串。在Python2中,这似乎是可以容忍的,只包含ASCII字符的Unicode字符串将与包含相同字符的ByTestString进行比较。对于在集合(或作为字典键)中使用它们来说,重要的是,只有ASCII哈希值的Unicode字符串与等效的ByTestRing值相同

但是,一旦您的数据包含不使用ASCII的字符串,任何利用这类功能的代码都很可能会被破坏。Unicode字符串和ByTestring之间的比较在Python3中根本不起作用,您可能也应该尝试切换Python3,因为Python2将在今年年底结束使用!因此,我强烈建议您更改代码,以确保始终将Unicode字符串与其他Unicode字符串进行比较,即使您需要以
u'1'
的形式编写它们,或者使用已知编码从bytestring对它们进行解码


您问题中代码中的另一个噪音是
L
,表示一些数字使用的是
long
类型,而不是
int
。与上面的Unicode vs byte string问题不同,这只是视觉上的分散,根本不是问题,因为大多数Python操作符和其他代码将在必要时透明地在这两种类型之间转换(包括集合)。在Python3中,所有的整数都是长的,特殊的符号也消失了。

接收的设备中
L
是什么?@Raj@MorZamir看起来Python版本有一些问题@SukumarRdjf这很奇怪,因为只是比较一个项目到另一个项目,它说它是相等的。@MorZamir它对我来说很好
>>设置(接收的\u设备)==设置(预期的\u设备)
返回
True
print([1, 2, 3, 4] == [3, 4, 2, 1]) # prints False because order matters to lists