2016-12-17 7 views
0
class Numbers: 
    data = [] 
    def read_from_row(self, row): 
     row_list = list(row) 
     for i in row_list: 
      self.data.append(i) 


list1 = ["15","16"] 
list2 = ["17","18"] 

instance = Numbers() 
instance.read_from_row(list1) 
print(instance.data) 

instance = Numbers() 
instance.read_from_row(list2) 
print(instance.data) 

ここにコードがあります。だから初めにinstanceはクラスNumbersのインスタンスであり、最初のリストを読んだ後にprint(instance.data)は自然に['15', '16']を印刷します。しかし、私は同じ変数instanceにまだNumbersクラスの新しいインスタンスを作成しますが、2番目のリストから読み込んだ後も何らかの理由で最初のリストのデータが残ります。 ['15', '16', '17', '18']を出力しています。Pythonクラスインスタンスの問題

私はPythonの初心者であり、C/C++を長時間コーディングした後、なぜこのようなことが起こるのか、何が期待されるのか理解できません。私はPython 2.7を使用しています。

ありがとうございます。

答えて

2

データはインスタンスメンバーではなく、クラスメンバーです。 数値クラスのすべてのインスタンスは、同じデータリストを「共有」します。

も参照してくださいここではあなたが期待するものを行うためにはPython: Difference between class and instance attributes

class Numbers: 
    def __init__(self): 
     self.data = [] 
    def readFromRow(self, row): 
     self.data.extend(row) 
2

インスタンス変数は__init__(..)に作成されます。

class Numbers(object):    # in Python 2.7 you should inherit from object 
    def __init__(self): 
     self.data = [] 

    def read_from_row(self, row): # (python naming convention) 
     self.data += row    # better way of appending to a list 
+0

Pythonの命名規則を示している場合は、 。 – pvg

+0

@pvg私はしないようにしていましたが、あなたが正しいと私はコードを更新しました。 – thebjorn

0

私はあなたをステップお勧めしますコードpythontutorで、Data = []をクラスブロックに入れることによって、すべてのインスタンス間で共有されます。 (その他の回答はすでに問題を解決する方法を示しています。私の目標は、問題が起こっている理由を理解する方法を提供することです)