2017-06-30 11 views
-1

辞書を使ってPython 2.7の異なる行列に異なるキーを割り当てようとしています。Python辞書キーを別の行列に割り当てる

EDIT - INFOの不足のため申し訳ありませんが、以前に

ここに私のコードの完全な、実施例である:

import random 
matrices_dict = {} 

matrix = [[1,1], 
     [1,1],] 

def checker(key_number): 
    for x in range(0, 2): 
     for y in range(0, 2): 
      matrix[x][y] = random.randint(0, 9) 

    matrices_dict[key_number] = matrix 
    print matrices_dict 

checker(0) 
checker(1) 

...その後、私は結果の辞書がないことを確認します生成された2つの異なる行列を格納しないでください。代わりに、第2のマトリクスに対応する両方の辞書キー1,2が作成されている。

つまり、最初のキーのペアリングが上書きされています。それは私には奇妙なことです。なぜなら、新しい行列を新しいキーに書き込むように明確に要求しているからです。

最初のキー/マトリックスのペアを上書きしないようにする方法についてのアドバイスはありますか?

HEREは

import random 
matrices_dict = {} 

def checker(key_number): 
    matrix = [[1,1], 
       [1,1],] 
    for x in range(0, 2): 
     for y in range(0, 2): 
      matrix[x][y] = random.randint(0, 9) 

    matrices_dict[key_number] = matrix 
    print matrices_dict 

checker(0) 
checker(1) 

ITを解決しようWHAT'S秒1が動作し、最初のものはない理由...私は明確ではないです。最初の1つでは、定義が呼び出されるたびに新しい行列が必要なのはなぜですか...なぜ以前に作成されたランダムな1つの作業を上書きしないのですか?

とにかかわらず、なぜべき辞書は、その前のキーのペアを上書きするかどうか、マトリックスの作成への影響​​のそれらの詳細のいずれか?

好奇心から知りたいですか?

+3

* same *オブジェクトへのこれらの参照はありますか?マトリックスはどのように生成されますか?新しいものを作るのではなく、単に行列を変更するだけです。 –

+1

いいえ、私はそれをチェック..それはうまく動作します。私は 'matrix = [1,2,3]'をサンプルとして与えました。生成された行列に何か問題がありますか?または何か他の問題? – void

+1

明らかに、関数内でグローバル値を使用していて、 'checker(X)'を呼び出すときに何が起きているのかを確認するためにそれらを出力します。 – PRMoureu

答えて

1

だから、(呼び出された)行列によって参照される新しいオブジェクトを生成し、その関数が呼び出されたときに参照(dictキー)をこの新しいオブジェクトに保存することです。たとえば、次のように何か作り出す

import numpy as np 
matrices_dict = {} 

def checker(key_number): 
     # here we create a new object and add a reference 
     # (key in this case) to this new object to the dict. 
     # Note that each time this func is called, this line is executed 
     # and thus a new object is created 
     matrix = np.random.rand(1,2) 
     matrices_dict[key_number] = matrix 

checker(1) 
checker(2) 

print(matrices_dict) 


{1: array([[ 0.33570685, 0.66721728]]), 2: array([[ 0.57074373, 0.62535056]])}

をそして、我々は、2つの異なる行列を取得するが、これはあなたが正しいしたい正確に何が?

しかし、次のコードでは、次の点が間違っています。単一のオブジェクトが作成され、関数が呼び出されるたびに、この単一のオブジェクトへの新しい参照がdictに追加されます。あなたはそれを記述するよう

import numpy as np 
matrices_dict = {} 
# here we create a single object 
# Note that this line gets executed only once, so there is really 
# just a single object that can be changed and referenced to. 
matrix = np.random.rand(1,2)  

def checker(key_number): 
     # add a new reference (key in this case) to the single object 
     # we created above to the dict 
     matrices_dict[key_number] = matrix 

checker(1) 
checker(2) 

print(matrices_dict) 

その後、我々は間違った振る舞いを得る:
{1: array([[ 0.86548754, 0.92694858]]), 2: array([[ 0.86548754, 0.92694858]])}

キーを参照すると、オブジェクトを理解することです。リストを作成すると、最初に '行列'によって参照されたオブジェクトが作成されました。関数が呼び出されると、同じオブジェクトに新しい参照が作成されました!、辞書のキーの形で。だから、辞書のキー、つまり '行列'を使うと、同じオブジェクトにアクセスして変更することになりました。

+0

ありがとうございます。私の問題は似ていましたが、定義内でマトリックスを変更していたので、あまり明白ではありませんでしたので、同じマトリックスを呼び出すわけではないことがわかりました。 上記の私のコメントを正確な内容で編集したところ、何がうまくいったのですか。しかし、それがなぜそのように機能するのかまだ十分には分かっていないので、それについて考えるなら面白いでしょう。 –

+1

参照とオブジェクトの仕組みを完全に理解したら明確になるので、その情報を参照することをお勧めします。その情報は、あなたが遭遇する可能性のあるプログラミング言語でお手伝いします。私はあなたのためにそれを明確にすることを希望して私の答えを編集する。 – MLenthousiast

関連する問題