因此,我正打算编写背包问题的一个变体,但是我对使用Python确实很陌生,因此偶然发现了这个问题。
我正在使用Jupyter(Python 3)
class Gene(object):
def __init__(self, weight, price):
self.weight = weight
self.price = price
obj1 = Gene(10, 20)
obj2 = Gene(25, 5)
obj3 = Gene(5, 10)
genes = [obj1, obj2, obj3]
class Chromosomes(object):
def __init__(self, flagIndex_of_items_contained = []):
self.flagIndex_of_items_contained = flagIndex_of_items_contained
self.myWeight = self.Define_myWeight()
def Define_myWeight(self):
weight = 0
for index_flag in range(len(self.flagIndex_of_items_contained)):
if(self.flagIndex_of_items_contained[index_flag] == 1):
weight = weight + genes[index_flag].weight
return weight
chromosome1 = Chromosomes([1,0,1])
print("chromosome1 weight: ", chromosome1.myWeight)
输出
1号染色体的体重:15
但是
genes [index_flag] .weight
如果我不将数组基因传递给类,该命令如何工作?
答案 0 :(得分:0)
问题在于您的变量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)