2016-02-21 41 views
-3

這應該是很簡單,但我看不出有什麼是怎麼回事:的Python - 變種越來越設置沒有我設置的話,我可能會失去我的腦海

def playlist_item_added(self, _): 
     temp_playlist = self.playlist_olv.GetObjects() 
     if not self.mirror_playlist: 
      self.mirror_playlist = temp_playlist 
      for item in self.mirror_playlist: 
       self.vlc_playlist.add_media(u.http_space_escape(item["loc"])) 
      self.vlc_player.set_media_list(self.vlc_playlist) 
      print "if" 
      print self.mirror_playlist 
     else: 
      print "else" 
      print self.mirror_playlist 
      for index, item in enumerate(temp_playlist): 
       if not item == self.mirror_playlist[index]: 
        media = vlc.Media(u.http_space_escape(item["loc"])) 
        #self.mirror_playlist.insert(index, item) 
        self.vlc_playlist.lock() 
        self.vlc_playlist.insert_media(media, index) 
        self.vlc_playlist.unlock() 

的問題是self.mirror_playlist似乎在沒有我問的情況下加入。我只是不明白爲什麼。這是一個事件處理程序,當有東西被添加到我的列表中時,它來到這裏。它檢查self.mirror_playlist是否已經設置 - 如果沒有,它設置它,沒問題。如果它已經設置,它會添加到它(else塊)。

注意我放入的打印件。當我添加第一個項目時,一切都按計劃進行。當我添加第二個項目時,print self.mirror_playlist就在else打印出第二個項目已添加到它之後。此外,我甚至在else塊的中間看到了插入該列表的代碼部分。

我檢查了代碼的每一行,並且mirror_playlist屬性在其他任何地方都沒有提及,除了這個函數和構造函數中它設置爲None。我仔細檢查了縮進,我仔細檢查了印刷圖片,發現流程確實如此(它是)。這個變量如何被添加到?我幾乎可以確定這件事很簡單,我看不到它。

+3

你只顯示某些未知類的成員函數。沒有足夠的真正重現問題。另外,什麼是GetObjects()返回?它是否每次創建一個新列表?如果沒有,那麼這可能是你的問題。 –

+0

執行'self.mirror_playlist = temp_playlist [:]'並查看問題是否存在。 – ekhumoro

+0

謝謝ekhumoro,它做到了。我使用了相同的「= list(temp_playlist)」,因此它更具可讀性。 Tom Karzes - 我的歉意。 GetObjects返回一個列表,它來自ObjectListView。 – linus72982

回答

0

當您添加的第一個項目,你是不是抄襲的列表中,更改該行:

self.mirror_playlist = temp_playlist[:] 
+0

這樣做 - 我忘了複製列表。對於未來的讀者,列表只是指向內存的指針,要複製列表,不能像對其他大多數項目那樣簡單地爲其分配不同的變量。作爲參考,我使用了「= list(temp_playlist)」,它與答案相同,但可讀性更強。 – linus72982

相關問題