2017-04-05 5 views
1

私のクラスで加減算しました。しかし、私が乗算をしようとすると、私は不必要な最外の配列を持っています。Python配列のコンストラクトをクラス

class Matrix: 
    def __init__(self,*args): 
     self.m = [] 
     self.m.extend(args) 

m1 = Matrix([1,2],[3,4]) 

これは機能します。しかし、乗算

empty = Matrix([[0 for row in range(col_matrix)] for col in range(row_self)]) 

のために私は[[[0, 0], [0, 0]]]ではなく[[0, 0], [0, 0]]を取得します。私に何ができる?

+1

アスタリスクを使用しているため、いいえ... –

答えて

1

それは理由extend自体ではありません。しかし、あなたは(アスタリスク*で)*argsを使用しているため。お電話の場合は確かに:

Matrix([[0,0],[0,0]]) 

を何が起こるだろうことはargsは(一つの要素を持つ)タプル([[0,0],[0,0]],)であるということです。したがって、タプルを拡張すると、タプルの単一要素appendappend([[0,0],[0,0]])が拡張されます。あなたはおそらく欲しい

ので、args一つ一つのすべての要素を拡張することです:

class Matrix: 
    def __init__(self,*args): 
     self.m = [] 
     for argi in args: 
      self.m.extend(argi)

あなたは一つのパラメータのみを受け入れるようにしたい場合は、あなたの内にプロセスを簡素化することができます:

class Matrix: 
    def __init__(self,data): # without asterisk 
     self.m = [] 
     self.m.extend(data)

など、それは、よりエレガントに:

class Matrix: 
    def __init__(self,data): 
     self.m = list(data)

あなたは浅いコピーを作る注:あなたがより良い深いコピーを作るそうでない場合、行はまだ同じになりますので、1つの行列の行への変更は、他のマトリックス上に反映されますので、。したがって:

from copy import deepcopy 

class Matrix: 
    def __init__(self,data): 
     self.m = deepcopy(data)