2015-01-31 2 views
0

Что не так с этой программой? Когда я его компилирую, один из списков с именем «single_bovines» добавляется, даже если нет команд, сообщающих что-либо, добавляемое к нему. Линии, которые заканчиваются линией #debug, являются линиями, которые я пытаюсь отладить программу.Список Python Append Screw up

class Cow(object): 
     def __init__(self, height, weight, strength): 
       self.height = height 
     self.weight = weight 
     self.strength = strength 
class Combination(object): 
    def __init__(self, cows): 
     self.cows = cows 
     self.evaluated_flag = False 
     self.satisfied_height = False 
     self.satisfied_strength = False 
     self.safety_factor = None 

    def evaluate(self, mark_height): 
     if sum(map(lambda c: c.height, self.cows)) >= mark_height: 
      self.satisfied_height = True 

     self.satisfied_strength = True 
     for i, cow in enumerate(self.cows): 
      if sum(map(lambda c: c.weight, self.cows[i+1:])) > cow.strength: 
       self.satisfied_strength = False 
       break 

     if self.satisfied_height and self.satisfied_strength: 
      self.safety_factor = 999999 
      for i, cow in enumerate(self.cows): 
       self.safety_factor = min(cow.strength - sum(map(lambda c: c.weight, self.cows[i+1:])), self.safety_factor) 

     return self.satisfied_height, self.satisfied_strength 

    def get_safety_factor(self): 
     return self.safety_factor 


file = open('guardmark.in', 'r').readlines() 
number_of_cows, mark_height = map(lambda item: int(item), file[0].rstrip('\n').split(' ')) 
consideration_list = [] 
for line in file[1:]: 
    height, weight, strength = map(lambda item: int(item), line.rstrip('\n').split(' ')) 
    consideration_list.append(Combination([Cow(height, weight, strength)])) 
single_bovines = consideration_list 
complete_list = [] 
consideration_done = True 

while filter(lambda c: c.evaluated_flag == False, consideration_list): 
    for combo in consideration_list: 
     print "a combo" #debug line 
     height_flag, strength_flag = combo.evaluate(mark_height) 
     if height_flag and strength_flag: 
      combo.evaluated_flag = True 
      complete_list.append(combo) 
     if not strength_flag: 
      combo.evaluated_flag = True 
     if strength_flag and not height_flag: 
      combo.evaluated_flag = True 
      print "put into consideration" #debug line 
      for single_cow in single_bovines: 
       print "a cow" , len(single_bovines)#debug line 
       if single_cow not in combo.cows: 
        combo_cows_copy = combo.cows 
        combo_cows_copy.append(single_cow) 
        consideration_list.append(Combination(combo_cows_copy)) 
if not complete_list: 
    print "Mark is too tall" 
else: 
    safety_factors = [] 
    for combo in complete_list: 
     safety_factors.append(combo.get_safety_factor()) 
    print max(safety_factors) 
+0

Не могли бы вы сократить свой пример кода? Было бы неплохо, если бы вы могли удалить части, не связанные непосредственно с проблемой. (Это не только полезно для нас, но и хорошая технология отладки, чтобы изолировать проблему.) –

+2

Я думаю, что проблема может заключаться в том, что вы выполняете 'single_bovines = рассмотрение_list', что означает, что оба имени переменных относятся к * тому же * списку , Если вам нужны два разных списка (оба имеют одинаковое содержимое), используйте 'single_bovines = list (review_list)' или 'single_bovines = рассмотрения_list.copy()' или 'single_bovines = рассмотрения_list [:]'. –

+0

Возможный дубликат [Python, изменяющий неправильный список?] (Http://stackoverflow.com/questions/4337106/python-modifying-wrong-list) – Fiver

ответ

5

Я думаю, что проблема может быть, что вы делаете

single_bovines = consideration_list 

... что означает, как имена переменных относятся к одному списку. Если вы хотите два различных списка (что оба имеют такое же содержание), используйте любой из:

single_bovines = list(consideration_list) 
single_bovines = consideration_list.copy() 
single_bovines = consideration_list[:] 

Все 3 из них будут копировать содержимое исходного списка в новый список.

0

См. Ответ здесь How to clone or copy a list? Я подозреваю, что, поскольку вы не делаете надлежащую копию рассмотрения_list, любые дополнительные добавления к нему добавляются к single_bovines.

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