2012-02-21 54 views
0

循環我有循環不是通過所有的元素列表

print(len(pcb.resources)) 
for res in pcb.resources: 
    print ("Releasing resource: " + res.name) 
    self.releaseResource(res.name, pcb) 
print("After: " + str(len(pcb.resources))) 

,輸出

2 # from 1st print: this is correct, I have 2 elements in list 
Releasing resource: R1 # is it not looping through the 2nd element? Notice the len() is 2 
After: 1 # from print after loop. I am expecting 0 

UPDATE

我發現它的東西做的函數調用。 releaseResource。但是releaseResource如何影響調用循環?

def releaseResource(self, name, pcb = None): 
    callScheduler = pcb is not None # if pcb is set, means calling from release resource, so dont call scheduler 1st 

    if pcb is None: 
     pcb = self.running 

    # check if resource exists 
    if not any(rcb.name == name for rcb in self.resources): 
     return False  
    rcb = next(r for r in self.resources if r.name == name) 

    # remove resource from running pcb's resources 
    pcb.resources.remove(rcb) 

    if len(rcb.waitingList) == 0: 
     # no waiting processes: resource is free 
     rcb.status = RCB.STATUS_FREE 
     rcb.heldBy = None 
    else: 
     # make dequeue from resource waiting list 
     pcb = rcb.waitingList.popleft() 

     # put resource into process resources list 
     pcb.resources.append(rcb) 
     rcb.heldBy = pcb 

     # make it ready 
     pcb.status = PCB.STATUS_READY 
     pcb.statusList = self.readyList 
     self.readyList.enqueue(pcb) 

     # call scheduler 
     if callScheduler: 
      self.scheduler() 

    return True 

回答

4

像你修改releaseResource名單在我看來你迭代,即在該行pcb.resources.remove(rcb)。試試這個:

for res in pcb.resources[:]: 
    print ("Releasing resource: " + res.name) 
    self.releaseResource(res.name, pcb) 

請參閱documentation