2017-01-31 14 views
0

こんにちは、私は属性としてリストを持つクラスを持っています。私はこのクラスをインスタンス化するときに、このインスタンスのこのリストを並べ替える必要があります。例:Pythonは初期化時にクラス属性リストを並べ替える

class A(object): 

    my_list = [1,2,3,4,5] 

    def __init__(self, first): 
     self.reorder_list(first) 

    def reorder_list(self, first): 
     self.my_list.insert(
      0, 
      self.my_list.pop(
        self.my_list.index(first) 
      ) 
     ) 

これは、次の手順を実行する必要があります

a = A(3) 
a.my_list 
[Out]: 3,1,2,4,5 

b = A(4) 
b.my_list 
[Out]: 4,1,2,3,5 

など

これが動作しているようです....しかし、常にではない...結果のように一貫性がありません。私はこれを好きなとき:

def __init__(self, first): 
    self.my_list = self.reorder_list(first) 

def reorder_list(self, first): 
    my_copy = copy.copy(self.my_list) 
    ... do reordering on my_copy ... 
    return my_copy 

それは一貫して動作します。

私の最初のコードはそれを行う方法ではないと誰かが私に説明することができますし、それを行う2番目の方法(コピーし、self.my_listをreassingする)はこれを行う正しい方法ですか?

+0

あなたの例では、実行可能ではありませんあなたはreorder_listで自己パラメータを見逃したのか? – Jul3k

+0

あなたは正しいです、私はそれを追加しました。 – RvL

答えて

1

Pythonでクラス属性に値を割り当てると、その値はそのクラスのすべてのインスタンスで共有されます。このため、Aのいずれの場合でものアイテムをself.my_listにすると、Aのすべてのインスタンスに反映されます。すべて同じリストを共有します。

インスタンス属性を作成するには、クラススコープにsome_attributeを設定する代わりに、self.some_attributeを設定する必要があります。 2番目の例では、self.my_list__init__という新しいリストオブジェクトに再割り当てするので、my_listはclass-wide属性をもう参照しません。そのインスタンスに固有です。

あなたの解決策は正しいです。混乱を避けるために、クラスとインスタンスの属性に同じ名前を使用しない方が良いです。例:

class A(object): 

    default_list = [1, 2, 3, 4, 5] 

    def __init__(self, first): 
     self.my_list = self.reorder_list(first) 

    def reorder_list(self, first): 
     my_copy = copy.copy(self.default_list) 
     # ... do reordering on my_copy ... 
     return my_copy 
+0

さて、ありがとう!私はそれがすべてのインスタンスの*同じリストであることに気付かなかった。コピーがすでに作成されていると思いました。また、デフォルトのリストの別の名前を選択するためのヒント。 – RvL

1

これは、クラス内のmy_listの範囲によるものです。 my_listはクラスレベルの属性です。したがって、最初のインスタンス化の後にA.my_listまたはa.my_listを介してアクセスできます。したがって、最初のリオーダの副作用として、最後のインスタンス化に設定されたものにA.my_listが変更されました。新しいリストが作成され、クラスレベル属性の値で初期化されて代わりに使用されるため、コピーが機能します。あなたはまた、このような何かを行うことができますespectedとして、それが動作するためには

>>> A.my_list 
[1, 2, 3, 4, 5] 
>>> a = A(4) 
>>> a.my_list 
[4, 2, 1, 5, 3] 
>>> A.my_list 
[4, 2, 1, 5, 3] 
0

class A(object): 

my_list = [] 

def __init__(self, first): 
    self.my_list = [1, 2, 3, 4, 5] 
    self.reorder_list(first) 

def reorder_list(self, first): 

    self.my_list.insert(
     0, 
     self.my_list.pop(
       self.my_list.index(first) 
     ) 
    ) 
関連する問題