gpt4 book ai didi

python - 类方法使用未传递的数组

转载 作者:太空宇宙 更新时间:2023-11-03 21:18:38 25 4
gpt4 key购买 nike

所以,我正在尝试编写背包问题的变体,但我对 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

但是

基因[index_flag].weight

如果我不将数组基因传递给类,这个命令如何工作?

最佳答案

问题是你的变量genes与类位于同一级别,即模块级别。在有问题的行中

weight = weight + genes[index_flag].weight

解释器只是看到没有具有函数Define_myWeight范围的局部变量,因此它检查全局范围(模块级别)。在这个级别上存在基因并且解释器可以使用它。

除此之外,还有导致您的代码被认为“写得不好”的问题。

  1. 仅在绝对必要时才使用全局变量。检查一些关于全局变量的任意教程来理解这个命题。

  2. 你不应该使用可变对象作为默认参数。列表是 Python 中的可变对象,这意味着它们可以更改。在这种情况下,请使用不可变对象(immutable对象),例如元组。

    def func1(some_arg = []):    # bad
    def func1(some_arg = ()): # ok
  3. 不要混合不同的格式样式。使用CamelCasenames_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)

关于python - 类方法使用未传递的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54493192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com