我有一個形式爲for thing in a_set:
的循環。它工作不正確,因爲偶爾和不一致地,它會從集合中拉出同樣的東西兩次。 (這不會導致程序崩潰,它只是得到了錯誤的答案。)我無法確定任何關於錯誤行爲的確定性;但我的調試嘗試很清楚,有時候會發生奇怪的事情。在我最密切觀察的情況下,組中有3個項目(前後)和循環執行4次,一次重複其中一個項目。這些項目是對我創建的類的對象的引用(更像C結構)。當我將for語句更改爲for thing in list(a_set):
時,不良行爲就消失了。任何人都可以解釋這個奇怪的錯誤迭代集?
我完全喪失解釋錯誤行爲。我非常肯定,循環體中沒有任何東西可以導致它發生兩次或更改thing變量的值。我很確定循環中發生的事情不會影響組合的組合。此外,即使它可以,我相信會導致RuntimeError
。對於可能造成這種情況的假設提出假設,我完全喪失了信心。連續運行相同代碼的缺乏可重複性特別神祕。我嘗試在一個更簡單的場景中重現症狀失敗了。儘管如此,爲了解決一個我無法解釋的問題,我覺得離開list()
的調用很愚蠢。任何人的假設都會受到歡迎。我需要關於在調試時應該嘗試消除哪些事情的想法。
更新:我認爲這個問題被錯誤地擱置,基於聲稱它是脫離主題。在這種情況下缺乏重現性是個問題,我懷疑我錯過了一些語言的細微差別。的確,情況確實如此,MSeifert的回答讓我想起了導致它的原因。但是,這並不像他推測的那麼簡單,正如我在評論他的答案時所注意的那樣。
我也混淆了這個問題,說集合中的對象是可變的。他們不是。它們是對屬性可更改的對象的引用。 (這可以從我寫的內容中推斷出來,但是我在一般意義上不正確地使用「mutable」一詞,而不是Python技術意義上的術語。)哈希值是對象的地址,與其值無關屬性。如果這些對象引用是可變的,那麼Python永遠不會讓我把它們放在一個集合中。
你將需要一些方法來重現這一點。你的套件是否有變化的可變對象? – matt
@matt。這是缺乏再現性的問題。是的,集合中的對象是可變的。他們有屬性正在改變;但他們仍然是同一個對象。在不發生不良行爲的大多數情況下,這些屬性的變化也在發生(沒有列表)。 –
你是如何創建你的設置? – matt