簡體   English   中英

python設置意外行為

[英]python set unexpected behavior

我正在嘗試修復在 AWS 上運行良好但在 GCP 上失敗的測試。

出於某種原因,GCP 更改了查詢結果的順序,因此我決定比較集合。

該列表僅包含 2 個項目,如您所見,它們是相同的,但是在比較列表時,它說它們不是。

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 True because the sets contain the same values

這與列表非常不同,列表按字典順序進行比較,並考慮其內容的順序。

print([1, 2, 3, 4] == [3, 4, 2, 1]) # prints False because order matters to lists

您的代碼中存在一個次要問題,實際上並沒有在這里引起問題,但看起來可能是這樣,這是一件壞事,以后可能會導致其他問題。 這就是您混合 Unicode 和字節字符串的事實。 在您似乎正在使用的 Python 2 中,這是可以容忍的,並且僅包含 ASCII 字符的 Unicode 字符串將與包含相同字符的字節字符串進行比較。 重要的是,對於在集合中(或作為字典鍵)使用它們,Unicode 字符串只有 ASCII 散列到與等效字節字符串相同的值。

但是,一旦您的數據包含不只使用 ASCII 的字符串,任何利用此類事物的代碼都很可能會被破壞。 Unicode 字符串和字節字符串之間的比較在 Python 3 中根本不起作用,您可能也應該嘗試切換它,因為 Python 2 將在今年年底達到其生命周期的終結! 因此,我強烈建議您更改代碼以確保始終將 Unicode 字符串與其他 Unicode 字符串進行比較,即使您需要將它們寫為u'1'或從已知編碼的字節字符串中解碼它們。

您問題中的代碼中的另一個噪音是L表示某些數字正在使用long類型而不是int 與上面的 Unicode vs 字節字符串問題不同,這只是一種視覺干擾,根本不是問題,因為大多數 Python 運算符和其他代碼會在必要時在兩種類型之間透明地轉換(這包括集合)。 在 Python 3 中,所有整數都是long s,特殊符號消失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM