2013-04-03 117 views
0

我正在建造一個生物模擬器。它將在兩個循環內運行,一個記錄一天,另一個記錄一天的時間。我有一本叫做清醒的我所有生物的字典,它是在每一天的開始。在一天中的某個時間點,一個生物會變得疲倦並且去睡覺。模擬將它們從清醒字典中刪除,以便它們不會被考慮用於剩餘時間循環。但問題在於,出於某種原因,清醒的字典會隨着每天的每一次循環而重置,以便訪問睡眠的生物。我已經在這裏發佈了相關的代碼,這是唯一一次清醒的使用。任何人都可以解釋我做錯了什麼?Python字典重置在循環外

 for i in range(self.Day): 
      start = clock() 
      awake = self.creatures 
      for j in range(self.timeOfDay):   
       print("Life Time " + str(i + 1) + "/" + str(self.Day) 
         + " Hour " + str(j + 1) + "/" + str(self.timeOfDay)) 
       print(self) 
       traveling = [] 
       for creature in awake: 
        goal = None 
        while goal == None: 
         priority = creature.priority() 
         if priority == "improveShelter": 
          goal = creature.findBest(land.Shelter, self.map) 
         elif priority == "sleep": 
          goal = creature.findBest(land.Shelter, self.map) 
          print(awake) 
          awake.pop(creature) 

回答

2

在每一天的開始,你需要做的creatures字典的副本,而不是引用它:

awake = dict(self.creatures) 

這是在Python各種可變類型的相當常見的陷阱。

Python只具有對象的引用,不像「變量」。因此,編寫a=b只是爲b已引用的同一對象創建一個名爲a的新參考。

+0

Woops。看起來我暫時忘了python使用引用。 – EasilyBaffled

6

您正在循環使用awake並同時對其進行修改。這意味着某些項目將被跳過跳過

創建複製的awake而不是斷開awake循環迭代器,所以你可以修改後不影響循環:

for creature in list(awake): 

你的最大的問題,然而,就是你設置awakeself.creatures在循環的開始,有效地改變self.creatures。也許你打算用self.awake代替?