2016-04-30 6 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"]) 

最後の2行(ここでは# this# and this)にコメントすると、.globalDict["theta1-" + str(k)]はすべて同じになります。したがって、コメントの場合はtrueを、そうでない場合はfalseを出力します。私はなぜそれが疑問ですか?私はそれの論理を得ていない。なぜPythonはゼロ以外の配列を覆っていませんか?

+0

あなたのタイトルに_Override_または_Overwrite_を意味しますか? –

答えて

1

theta1およびtheta2のリストはオブジェクトです。最初のループこれらのオブジェクトを変更します。これらのオブジェクトへの参照をglobalDictに保存します。

しかし、私は同じオブジェクトを再度修正しますが、明らかにすべての参照は修正された辞書を指しています。これを避けるためには、反復ごとにの新しいオブジェクトを作成する必要があります。それで、これらの2行を追加すると、動作が変化します。

あなたの状況は単純に似ています:

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

はまた、それが「ゼロ」配列で行うには何もを持っていないことに注意してください。最後の2行を次のループで置き換えることができます。

次のループで値が上書きされるため、同じ結果が得られます。 ちなみに


(唯一の違いは...これが最後の反復でtheta1theta2をゼロにしないことです):あなた乱数の配列を生成するnumpy.random.normalを使用したほうが良い場合があります。

>>> 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]]) 
関連する問題