2014-01-07 5 views
0

У меня действительно странная ошибка в моем коде. Я попытался создать код, который создаст случайный сдвиг для меня и моей команды, есть 5 смен в 5 дней, и каждый должен быть в разной смене каждый день.его кажется python '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. рабочий, который не получил выбранную стилину, пропустил мой список WORKERS. его, как поп, полностью удаляет его.

вот пример моей отладочной:

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 не получает выполнение кодового комента для строки 'print (« worker »+ worker_chosen +« не получил выбор .. »)' –

ответ

1

Вы всегда удаление элементов из списка. Если любой из них должен не быть выбранным, добавьте их обратно в список или не удаляйте их до тех пор, пока они не будут выбраны.

Отметьте, что WORKERS обрабатывается на месте; сам объект списка изменяется, а не копия. Если вы имели в виду, чтобы манипулировать копию, то сначала создать неполную копию с:

WORKERS = list(WORKERS) 

или

WORKERS = WORKERS[:] 

В противном случае абонент вашей функции будет увидеть сделанные изменения; self.today_workers по-прежнему ссылается на тот же список.

+0

действительно? его редактировать стартовый список? но почему? Я просто передаю этот список WORKER, его не создает ** локальный ** список внутри функции? –

+0

Нет, он создает локальную ** ссылку ** внутри функции. Само значение не копируется, и поскольку оно изменено, любая другая ссылка на одно и то же значение будет видеть изменения. –

+0

Хо, поэтому его не работает со строкой, потому что она не изменчива? спасибо, первый раз, что я вижу что-то подобное. –

 Смежные вопросы

  • Нет связанных вопросов^_^