2017-01-18 13 views
0

私は次のコードを持っている:オブジェクト指向のインスタンス変数の問題

class Stock(object): 
    def __init__(self,name,price): 
     self.name = name 
     self.price = price 

    def Add_Price(self,data): 
      self.price.append(data) 

def test(): 
    l=[] 
    n=0 
    while n < 390: 
     s1= Stock('A', l) 
     s2= Stock('B', l) 

     s1.Add_Price(d1[n]) # d1 is a list with the prices for A # 
     s2.Add_Price(d2[n]) # d2 is a list with the prices for B # 

     print s1.price, s2.price 

     n=n+1 

私はそれを実行すると、私はs1.priceを呼び出すと、あなたは株式Aの価格で配列を受け取り、s2.priceが持っているということであろうと想定していますが在庫の価格B。しかし、私がそれを実行すると、s1.prices2.priceは同じです。

したがって、self.priceに新しい値を追加すると、クラスの現在のインスタンスの変数に追加されていないようです。

誰でも私が間違っていることを指摘できますか?

編集

電流出力:

[10 150] [10 150] 
[10 150 10.2 150.3] [10 150 10.2 150.3] 

所望の出力:

[10] [150] 
[10 10.3] [ 150 150.3] 

答えて

1

あなたは両方のインスタンスに同じリストの参照を渡しています。リストは変更可能なオブジェクトなので、参照渡しです。しかし、あなたはまた、原因、それは同じ参照を共有するという事実に、クラスの外部L_1とL_2するために追加されます

def test(): 
    l_1 = [] 
    l_2 = [] 
    s1= Stock('A', l_1) 
    s2= Stock('B', l_2) 
    n=0 

    while n < 390: 
     s1.Add_Price(d1[n]) # d1 is a list with the prices for A # 
     s2.Add_Price(d2[n]) # d2 is a list with the prices for B # 

一つの解決策は、二つのリストを作成することです。 d1とd2は価格のリストなので、インスタンス化時にリストを作成し、Add_Price()にリストが渡された場合は株式のリストを拡張し、リストでない場合は価格を追加することもできます。

ストッククラスのコンストラクタ:テスト()関数で次に

class Stock(object): 

    def __init__(self,name,prices=None): 
     self.name = name 
     self.price = prices or [] #create a new list on instantiation 

    def Add_Price(self,data): 
     if isinstance(data, list): 
      self.prices.extend(data) 
     else: 
      self.prices.append(data) 

def test(): 
    s1 = Stock('A') 
    s2 = Stock('B') 

    s1.Add_Price(d1[:390]) 
    s2.Add_Price(d2[:390]) 

d1[:390]は、インデックス390(排他的にインデックス0(包括的)からすべての要素を表しスプライシング、あります)、whileループの必要性を取り除くことができます。

+0

ありがとうございました。ループが他の理由でそこにあると言わざるを得ないでしょう...しかし、答えの最初の部分が問題を解決しました –

+0

@abcla私は私の投稿を編集しました。 whileループ内の他の場所でその特定のn要素を使用していない場合でも、スプライシングのパフォーマンス上の利点を使用できますが、他の場所で要素を使用している場合は、状況に応じて個別に追加することができます。また、これが正解であれば、それを受け入れてください:) –

関連する問題