Проблема в том, что ваша переменная genes
живет на том же уровне, что и классы, уровень модуля.В проблемной строке
weight = weight + genes[index_flag].weight
интерпретатор просто видит, что нет локальной переменной с областью действия функции Define_myWeight
, поэтому он проверяет глобальную область (уровень модуля).На этом уровне существует genes
, и интерпретатор может его использовать.
Кроме того, проблемы, из-за которых ваш код считается "плохо написанным".
Использованиеглобальные переменные, только если они абсолютно необходимы.Чтобы понять это предложение, ознакомьтесь с произвольным учебником по глобальным переменным.
Никогда не следует использовать изменяемый объект в качестве параметра по умолчанию.Списки являются изменяемыми объектами в Python, это означает, что они могут быть изменены.В таких случаях используйте неизменяемые объекты, такие как кортежи.
def func1(some_arg = []): # bad
def func1(some_arg = ()): # ok
Не смешивайте разные стили формата.Используйте CamelCase
или names_with_underscores
.Посмотрите Python Style Guide для этого.
Вот идея для улучшения вашего кода.Хромосомы состоят из разных генов.Следующий код моделирует это отношение.
class Gene:
def __init__(self, weight, price):
self.weight = weight
self.price = price
class Chromosom:
def __init__(self):
self.genes = []
self.flag_idx = []
self.weight = 0
def add_gene(self, weight, price):
self.genes.append(Gene(weight, price))
def compute_weight(self, flags):
for i, flag in enumerate(flags):
if flag == 1:
self.weight += self.genes[i].weight
Использование:
ch = Chromosom()
ch.add_gene(10, 20)
ch.add_gene(25, 5)
ch.add_gene(5, 10)
ch.compute_weight((1, 0, 1))
print(ch.weight)