2017-04-22 8 views
1

コードの簡単な説明辞書をすべての辞書に上書きする関数

メインコードは最初に私の関数に渡される空白の辞書を作成します。この関数は、各数値の数を計算し、辞書を更新して返します。しかし、関数が実行されると、入力 'blank_dictionary'はそれが返す辞書( 'new_dictionary')と同じになるように上書きされます。なぜこれが起こるのですか?メインコードの中の「辞書」をブランクのままにして再利用できるようにしたい。

def index_list(lst, blank_dictionary): 
    new_dictionary = blank_dictionary 
    for i in lst: 
     new_dictionary[i] += 1 
    return new_dictionary 

number = 1 
maximum = 3 
numbers = range(1,maximum+1) 

dictionary = {} 
for i in numbers: 
    dictionary[i] = 0 

print ('original blank dictionary', dictionary) 
new_dictionary = index_list([3,3,3],dictionary) 
print ('new dictionary which indexed the list', new_dictionary) 
print ('should still be blank, but isnt', dictionary) 

出力:

original blank dictionary {1: 0, 2: 0, 3: 0} 
new dictionary which indexed the list {1: 0, 2: 0, 3: 3} 
should still be blank, but isnt {1: 0, 2: 0, 3: 3} 

どうもありがとうございました

+2

[辞書をコピーしてのみ編集する方法](http://stackoverflow.com/questions/2465921/how-to-copy-a-dictionary-and-only-edit-the-copy)の可能な複製) –

+1

はい、ありがとう@PierPaolo。 – PurpleDiane

+0

[変数と代入がPythonでどのように動作するかを読む](https://nedbatchelder.com/text/names.html) – user2357112

答えて

3

あなたはblank_dictionaryから参照new_dictionaryを設定しています。行をnew_dictionary = dict(blank_dictionary)に変更しても問題ありません。 dict()コンストラクタ関数を使用すると、新しいnew_dictionaryとなるため、blank_dictionaryは変更されません。

collectionsモジュールのdefaultdictについて調べることをおすすめします。各要素が表示される回数を数えればよい場合は、collections.counterと考えてください。

+0

dict()が使用されていない場合はCのポインタのように見えます?大変ありがとうございました。 – Nishalc

1

は、ルックhere

をお持ちのあなたのコード内で何が起こっているかを示します。

1

この動作はdictsに限定されません。 Pythonでは、変更可能なオブジェクトを関数に渡すたびに、この関数はコピーではなく元のオブジェクトに対して動作します。これは、タプルや文字列のような不変オブジェクトに対しては当てはまりません。

しかし、この場合、最初にブランク辞書を関数に渡す必要はありません。この関数は、新しい辞書を作成してそれを返すことができます。