0

配列を取り、答えを計算するクラスがあります。クラスは次のとおりです。

class Delish:
    ing = []
    rmax = []
    rmin = []
    lmax = []
    lmin = []
    answer = 0

    def rightmax(self):
        # sets rmax

    def rightmin(self):
        # sets rmin



    def leftmax(self):
        # sets lmax

    def leftmin(self):
        # sets lmin


    def calculate(self):
        #calulates answer

    def __init__(self,array):
        self.ing = list(array)
        self.rightmax()
        self.rightmin()
        self.leftmax()
        self.leftmin()
        self.calculate()

これにより、出力 4 13 が得られます (これは正しいです)。

b = Delish([1,1,-1,-1])
a = Delish([1,2,3,4,5])


print a.answer,b.answer

そして、これは出力7 13を与えます(これは間違っています)

a = Delish([1,2,3,4,5])
b = Delish([1,1,-1,-1]) 

print a.answer,b.answer

ライブ プログラミング コンテストの一部であるため、完全なコードを掲載することはできません。しかし、この奇妙な動作の原因を知りたいです。すべてのメソッドは自分自身に取り組んでいます。変数のみ。したがって、すべてのオブジェクトは互いに独立している必要がありますよね?

アルゴリズムの多くを提供しない場合は、詳細を追加できます。ありがとうございました。

4

2 に答える 2

0

Python では、コンストラクター内でインスタンス変数を宣言します。

実際に行っているのは、クラス変数の宣言です。Python でインスタンス変数が必要な場合は、コンストラクターで変数を宣言する必要があります。

class Delish:
  # This is a class variable. 
  # All instances can refer to this as self.foo
  foo = 42 

  def __init__(self,array):
    self.ing = [] # This is an instance variable
    self.rmax = []
    self.rmin = []
    self.lmax = []
    self.lmin = []
    self.answer = 0
    self.ing = list(array)
    self.rightmax()
    self.rightmin()
    self.leftmax()
    self.leftmin()
    self.calculate()
于 2013-06-12T09:55:53.253 に答える
0

あなたはおそらく C++/Java プログラマーです。

ingが割り当てられて で上書きされるものを除いて、すべてのフィールド__init__クラス フィールドです。つまり、クラスのすべてのインスタンス間で共有されます。インスタンスの初期化を次の場所に移動します__init__

class Delish:
    # Nothing here

    def __init__(self, array):
        self.ing = list(array)
        rmax = []
        rmin = []
        lmax = []
        lmin = []
        answer = 0

        self.rightmax()
        self.rightmin()
        self.leftmax()
        self.leftmin()
        self.calculate()
于 2013-06-12T09:56:30.847 に答える