2016-03-24 5 views
1

私は、私が持っているデータセットを整理するために、Pythonでオブジェクトの3Dリストを使用しています。オブジェクトの要素が非常にユニークではないことに気づいています。つまり、配列のオブジェクト内の変数が他のオブジェクトで更新されています。私の問題を示す最小の実例を以下に示します。Python2.7:オブジェクトの3Dリストが一意であることを確認する

class myClass: 
     def __init__(self,ListA=[],ListB=[],ListCount=0): 
       self.ListA = ListA 
       self.ListB = ListB 
       self.ListCount = ListCount 

     def add_data(self,ElementA,ElementB): 
       self.ListA.append(ElementA) 
       self.ListB.append(ElementB) 
       self.ListCount = self.ListCount + 1 

     def check_data(self): 
       if(len(self.ListA) != self.ListCount): 
         print("Error: Unaccounted for Data in Object!") 
         print("Object has %d elements. Thinks it has %d"%(len(self.ListA),self.ListCount)) 

このクラス定義を使用するPythonコードは、このようなものになります。

import random 

ObjectArray = [[[myClass() for k in range(4)] for j in range(3)] for i in range(2)] 
#Print addresses of object array 
print("Addresses of the individual object elements in the 3D list ") 
for i in range(0,2): 
     for j in range(0,3): 
       for k in range(0,4): 
         print(ObjectArray[i][j][k]) 

#Loop over object array and fill each object with some data 
for i in range(0,2): 
     for j in range(0,3): 
       for k in range(0,4): 

         NumData = int(10*random.random()) 

         for m in range(0,NumData): 

           #Generate some junk data to insert into the list of this object 
           ListAData = int(10*random.random()) 
           ListBData = int(10*random.random()) 

           ObjectArray[i][j][k].check_data() 
           ObjectArray[i][j][k].add_data(ListAData,ListBData) 
           ObjectArray[i][j][k].check_data() 

何が欠けていますか? Python 2.7でオブジェクトの3Dリストを使用することは可能ですか?リスト内の各オブジェクトは、印刷するときに一意のメモリアドレスを持つように見えます。どんな洞察力も大変高く評価されます。

このコードの出力のサンプルは次のとおりです。

Addresses of the individual object elements in the 3D list 
<__main__.myClass instance at 0x7fc59ad4ef80> <__main__.myClass 
instance at 0x7fc59ad635a8> <__main__.myClass instance at 
0x7fc59ad63248> <__main__.myClass instance at 0x7fc59ad63440> 
<__main__.myClass instance at 0x7fc59ad6d320> <__main__.myClass 
instance at 0x7fc59ad6d368> <__main__.myClass instance at 
0x7fc59ad6d3b0> <__main__.myClass instance at 0x7fc59ad6d3f8> 
<__main__.myClass instance at 0x7fc59ad6d488> <__main__.myClass 
instance at 0x7fc59ad6d4d0> <__main__.myClass instance at 
0x7fc59ad6d518> <__main__.myClass instance at 0x7fc59ad6d560> 
<__main__.myClass instance at 0x7fc59ad6d638> <__main__.myClass 
instance at 0x7fc59ad6d680> <__main__.myClass instance at 
0x7fc59ad6d6c8> <__main__.myClass instance at 0x7fc59ad6d710> 
<__main__.myClass instance at 0x7fc59ad6d7a0> <__main__.myClass 
instance at 0x7fc59ad6d7e8> <__main__.myClass instance at 
0x7fc59ad6d830> <__main__.myClass instance at 0x7fc59ad6d878> 
<__main__.myClass instance at 0x7fc59ad6d908> <__main__.myClass 
instance at 0x7fc59ad6d950> <__main__.myClass instance at 
0x7fc59ad6d998> <__main__.myClass instance at 0x7fc59ad6d9e0> 
Error: Unaccounted for Data in Object! Object has 4 elements. Thinks it has 0 
Error: Unaccounted for Data in Object! Object has 5 elements. Thinks it has 1 
Error: Unaccounted for Data in Object! Object has 5 elements. Thinks it has 1 
Error: Unaccounted for Data in Object! Object has 6 elements. Thinks it has 2 
Error: Unaccounted for Data in Object! Object has 6 elements. Thinks it has 2 
Error: Unaccounted for Data in Object! Object has 7 elements. Thinks it has 3 
Error: Unaccounted for Data in Object! Object has 7 elements. Thinks it has 3 
+0

これらはmyClassの一意のインスタンスですが、 'print(id(ObjectArray [i ] [j] [k] .ListA)) 'あなたはそれらがすべて同じリストを持っているのを見なければなりません...." Pythonで可変のデフォルト引数を探してください " –

答えて

3

変更それ

class myClass: 
    def __init__(self,ListA=None,ListB=None,ListCount=0): 
      self.ListA = [] if ListA is None else ListA 
      self.ListB = [] if ListB is None else ListB 
      self.ListCount = ListCount 

に、これは、以下の

が考える可変デフォルトの引数を避けることができます

class MyClass: 
    def __init__(self,a=[],b=None): 
     self.a = a 
     print "ID of a:",id(a) 
     if b is not None: 
      self.a.append(b) 

print MyClass(b=5).a 
print MyClass(b=6).a 
print MyClass(b=7).a 

各MyClassには一意のメモリ位置がありますが、3つとも同じ配列(aのデフォルト引数)を指しています

+0

それはまさに私の問題@JoranBeasleyの解決策です。他の人には、変更可能なデフォルト引数の新しいPythonプログラマーの共通の問題についての詳細情報があるWebページがあります。 [変更可能なデフォルトの引数](http://docs.python-guide.org/en/latest/writing/gotchas/) – wandadars

関連する問題