2014-01-07 122 views
0

我的代码中有一个非常奇怪的错误。 我试图创建一个代码,为我和我的团队创建随机班次,5天内有5个班次,每个人每天都应该有不同班次。它似乎蟒蛇'list.pop()'不工作,因为它应该

代码它的小大,所以我会尝试通过只有相关的作品在这里,但随时要求更多的信息,我会尝试澄清。

from random import randint 
shifts = [4, 4.2, 5, 6, 7] 
days_names = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday'] 
workers_names = ['Itai', 'Or', 'Reut', 'Kuka', 'Aviel'] 


class Day(object): 
    #create empty shift : worker list 
    def __init__(self,shift,name): 
     self.shift_list = { x:'' for x in shift} 
     self.name = name 


    # create a list of workers that not work this day and choose 
    # choose a random worker in 'worker_chosen' function 
    def shift_arrenge(self): 
     self.today_workers = [x for x in workers_names if (x not in self.shift_list.values())] 
     for shift, worker in self.shift_list.items(): 
      if not worker: 
       self.shift_list[shift] = worker_chosen(shift,self.today_workers,self.name) 
     print (self.shift_list) 

def worker_chosen(shift,WORKERS,day_name): 
    worker_chosen ='' 
    print("today_workers") 
    print(WORKERS) 
    while(WORKERS): 
     worker_chosen = WORKERS.pop(randint(0, len(WORKERS)-1)) 
     print("worker chosen: "+ worker_chosen) 
     #check if the worker got this shift already if not update on the worker and return it 
     if not (workers[worker_chosen].shift_list[shift]): 
      workers[worker_chosen].update(shift,day_name) 
      break 


    return worker_chosen 

现在的错误是在worker_chosen = WORKERS.pop(randint(0, len(WORKERS)-1))左右。 如果选择的工人班次已经被选中并且程序选择了另一名工人,那么在下一次我的shift_arrenge函数调用worker_chosen时。没有选择阶梯的工作人员从我的工作人员名单中错过了。它像流行音乐完全移除他。

这里就是比如我调试输出:

today_workers 
['Itai', 'Or', 'Reut', 'Kuka', 'Aviel'] 
worker chosen: Or 
worker Or didn't got choose.. 
worker chosen: Reut 
worker Reut didn't got choose.. 
worker chosen: Kuka 
worker Kuka got choose! 
#now move to the next shift.. 
today_workers 
['Itai', 'Aviel'] # but only kuka got choose! 
+5

如果有疑问,责怪Python的'list.pop()'?我认为我们可以认为问题在于别处。 :-) –

+0

哪里是打印'工人没有得到选择..'的代码? –

+0

我在这里删除此行。如果if代码没有得到执行代码coem到行'print(“worker”+ worker_chosen +“没有选择..”)' –

回答

1

您是总是从列表中删除元素。如果他们中的任何一个应该选择而不是,请将它们重新添加到列表中,或者在实际选择之前不要删除它们。

请注意WORKERS被操纵到位;列表对象本身被改变,而不是副本。如果您用来处理一个副本,则首先创建一个浅副本:

WORKERS = list(WORKERS) 

WORKERS = WORKERS[:] 

否则你的函数会看到所做的更改的调用者; self.today_workers仍然是对同一个列表的引用。

+0

真的吗?其编辑的起始名单?但为什么?我只是将这个列表传递给WORKER,它不在函数内创建一个** local **列表? –

+0

不,它会在函数内创建一个本地**引用**。值本身不会被复制,并且因为它是可变的,所以对相同值的任何其他引用都会看到更改。 –

+0

何,所以它不适用于字符串,因为它不可变?谢谢,我第一次看到类似的东西。 –

相关问题