2017-08-16 14 views
0

私はPythonを初めて使っています(私は主なプログラミング言語としてC++を使用しています)。私は最近、Python3で奇妙な問題に出会った。奇妙なパラメータで呼び出されるクラスメソッド

ここにはクラスCSVDataがあります。コンストラクタは、pathの変数がコンストラクタに渡された場合、namesdataの長さを出力します。 CSVファイルをロードします。

class CSVData: 
    def __init__(self, path="", names=[], data=[]): 
     self.names = names 
     self.data = data 
     print(len(names)) 
     print(len(data)) 
     print("") 
     if path != "": 
      self.load(path) 

    def load(self, path): 
     f = open(path, 'r') 

     for i, row in enumerate(csv.reader(f)): 
      if i == 0: 
       self.names = row 
      else: 
       self.data.append(row) 
     f.close() 

このクラスを呼び出して同じCSVファイルを2回ロードすると、次の出力が表示されました。

data = CSVData(mainCSVPath) 
# again 
data = CSVData(mainCSVPath) 

出力:それが必要すべてnamedataパラメータは、このように、設定されることはありませんので、出力が0であるが、空のリストでなければなりません

0 
0 

0 
9363 

。それでもdataの長さは9363で、私のCSVが持つ行の数です。

なぜですか? dataが設定されていないと、self.dataが空のリストになるように修正できますか?

答えて

-1

理由は単純aは参照によって呼び出されます。 この関数は、各呼び出しで同じオブジェクトを使用し続けます。私たちが行う改造は「粘着性」です。

>>> class A(object): 
...  
...  def __init__(self, a=[]): 
...   self.a = a 
...   
...  def add(self): 
...   self.a.append('a') 
...   
... 
>>> a1 = A() 
>>> a1.a 
[] 
>>> a2 = A() 
>>> a2.a 
[] 
>>> 
>>> a1.add() 
>>> a1.a 
['a'] 
>>> a2.a 
['a'] 
>>> 
関連する問題