2016-03-24 22 views
1

Sahip olduğum veri kümesini düzenlemek için Python'daki 3B nesne listesini kullanıyorum. Nesne öğelerinin tamamen benzersiz olmadığını fark ediyorum, yani dizinin bir nesnesindeki değişkenler başkaları tarafından güncelleniyor. Sorunumu gösteren minimal bir çalışma örneği aşağıda gösterilmiştir.Python2.7: Nesnelerin 3D listesinin benzersiz olduğundan emin olun

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)) 

Bu sınıf tanımını kullanan python kodu böyle bir şeyle gider.

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() 

Neyi özledim? Python 2.7'deki 3B nesne listesini kullanmak mümkün mü? Listedeki her bir nesne, yazdırdığımda benzersiz bir bellek adresine sahip gibi görünüyor. Herhangi bir anlayış büyük ölçüde takdir edilecektir.

bu koddan çıkış örneği geçerli:

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

için varsayılan noktayı işaret ederler, bunlar myClass'ın benzersiz örnekleridir, ancak yazdırmayı yazdırırsanız (id (ObjectArray [i ] [j] [k] .ListA)) 'hepsinin aynı listeye sahip olduğunu görmelisiniz ...." python'da varsayılan değişken argümanları "araması –

cevap

3

değişiklik,

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 

bu şu

düşünün değişken varsayılan argümanlar önleyecektir

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 öğelerinin her birinin benzersiz bir bellek konumuna sahip olduğunu unutmayın, ancak hepsi aynı diziye (a)

+0

Tam olarak benim sorunum olan çözüm @JoranBeasley. Diğerleri için, burada yeni varsayılan Python programcıları için varsayılan argümanların ortak sorunu hakkında daha fazla bilgi içeren bir web sayfası. [Değiştirilebilir Varsayılan Değişkenler] (http://docs.python-guide.org/en/latest/writing/gotchas/) – wandadars

İlgili konular