2016-04-30 9 views
0
for k in range(0, popSiz): 
    for i in range(0, mn1[0]): 
     for j in range(0,mn1[1]): 
      theta1[i][j] = random.gauss(0, 1) 

    for i in range(0, mn2[0]): 
     for j in range(0,mn2[1]): 
      theta2[i][j] = random.gauss(0, 1) 
    GameLogic.globalDict["theta1-" + str(k)] = theta1 
    GameLogic.globalDict["theta2-" + str(k)] = theta2 
    theta1 = [[0 for x in range(mn1[1])] for y in range(mn1[0])] # this 
    theta2 = [[0 for x in range(mn2[1])] for y in range(mn2[0])] # and this 
print(GameLogic.globalDict["theta1-0"]==GameLogic.globalDict["theta1-1"]) 

Wenn ich kommentieren Sie die letzten beiden Zeilen (wo es heißt # this# and this) es macht den .globalDict["theta1-" + str(k)] s gleich. Es wird also "True" ausgegeben, wenn es kommentiert wird, und "False", wenn dies nicht der Fall ist. Ich frage mich, warum ist das so? Ich verstehe die Logik nicht.Warum überschreibt Python nicht-null-Arrays?

+0

in Ihrem Titel, meinst du _Override_ oder _Overwrite_? –

Antwort

1

Die Listen theta1 und theta2 sind Objekte. Ihre anfänglichen Schleifen ändern diese Objekte. Sie speichern dann einen Verweis auf diese Objekte in der globalDict.

Wenn Sie dann aber wieder dieselben Objekte modifizieren, werden offensichtlich alle Referenzen auf ein modifiziertes Wörterbuch zeigen. Sie müssen neue Objekte für jede Iteration erstellen, um dies zu vermeiden. und deshalb ändert das Hinzufügen dieser zwei Linien das Verhalten.

Ihre Situation ist ähnlich wie die einfachere:

>>> a = [] 
>>> d = {} 
>>> d['a'] = a 
>>> a.append(1) 
>>> a 
[1] 
>>> d['a'] # modified because d is actually storing a reference to that list. 
[1] 
>>> a = [] # now a is a completely different object 
>>> a 
[] 
>>> d['a'] # old reference keep original a value alive. 
[1] 

Beachten Sie auch, dass es nichts zu tun mit "Nullstellung" Arrays hat. Sie können die letzten beiden Zeilen durch

theta1 = [el.copy() for el in theta1] # or list(el) for el in ... 
theta2 = [el.copy() for el in theta2] # or el[:] for el in ... 

ersetzen, um das gleiche Ergebnis zu erzielen, da die nächste Schleife die Werte überschreibt. (Der einzige Unterschied ist, dass dies nicht theta1 Null aus wird und theta2 in der letzten Iteration ...)


Durch die Art und Weise: Sie numpy.random.normal mit besser sein können Arrays von Zufallszahlen zu erzeugen:

>>> numpy.random.normal(size=(5,5)) 
array([[ 1.16883072, -1.12038842, -0.14351093, 1.20373197, 0.79088439], 
     [-0.80960599, -0.56876464, 1.12962452, 0.20582962, -1.36239647], 
     [-1.07225523, 0.56895514, -0.07132619, 1.36478187, 0.62836829], 
     [ 0.69711124, -0.81957984, -1.27820196, 0.04203822, 1.68618401], 
     [-0.54687767, 0.34994992, -0.91724856, 0.2631614 , 0.08691433]]) 
Verwandte Themen