类方法使用未传递的数组

时间:2019-02-02 12:42:48

标签: python class global-variables pass-by-reference

因此,我正打算编写背包问题的一个变体,但是我对使用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

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

1 个答案:

答案 0 :(得分:0)

问题在于您的变量genes与类(模块级别)位于同一级别。在有问题的线上

weight = weight + genes[index_flag].weight

解释器只看到函数Define_myWeight的作用域没有局部变量,因此它检查全局作用域(模块级别)。在此级别上genes存在,解释器可以使用它。

除此之外,由于这些原因,您的代码被认为是“编写错误”的。

  1. 仅在绝对必要时使用全局变量。查看一些有关全局变量的任意教程以了解这一主张。

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

    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)