2016-03-24 9 views
1

Ich verwende eine 3D-Liste von Objekten in Python, um einen Datensatz zu organisieren, den ich habe. Ich bemerke, dass meine Objektelemente nicht ganz eindeutig sind, d. H. Variablen in einem Objekt des Arrays werden in anderen aktualisiert. Ein minimales funktionierendes Beispiel, das mein Problem veranschaulicht, wird unten gezeigt.Python2.7: Stellen Sie sicher, dass die 3D-Liste der Objekte eindeutig ist

Der Python-Code, der diese Klassendefinition verwendet, geht ungefähr so.

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

Was habe ich verpasst? Ist es möglich, 3D-Listen von Objekten in Python 2.7 zu verwenden? Jedes Objekt in der Liste scheint eine eindeutige Speicheradresse zu haben, wenn ich es ausdrucke. Jede Einsicht würde sehr geschätzt werden.

Eine Probe der Ausgabe von diesem Code ist:

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

Sie sind eindeutige Instanzen von MyClass, aber wenn Sie die Print (ID (ObjectArray [i ] [j] [k] .ListA)) 'Sie sollten sehen, sie haben alle die gleiche Liste .... Suche nach" veränderbare Standardargumente in Python " –

Antwort

3

Änderung es

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 

dies die veränderbaren Standardargumente

ist Folgendes zu beachten

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 
zu vermeiden

Beachten Sie, dass jede MyClass einen eindeutigen Speicherort hat, aber alle 3 zeigen auf das gleiche Array (das Standardargument für a)

+0

Das ist genau die Lösung für mein Problem @JoranBeasley. Für andere gibt es hier eine Webseite mit weiteren Informationen zum häufigen Problem für neue Python-Programmierer von veränderbaren Standardargumenten. [Änderbare Standardargumente] (http://docs.python-guide.org/en/latest/writing/gotchas/) – wandadars

Verwandte Themen