2017-01-25 4 views
1

I持って次のコード付加は、すべてのアレイに追加

a_dict = dict.fromkeys(['a', 'b', 'c'], []) 
a_dict['a'].append(1) 
print(a_dict) 

出力1はなく持つただ一つのすべてのアレイに追加された理由

`{'a': [1], 'c': [1], 'b': [1]}` 

キーa?キーaで追加する場合はどうしたらいいですか?

+0

実際に説明したものではありませんが、これは問題を解決します - 'a_dict ['a'] = 1' – SRC

答えて

0

aha、dict.fromkeysは値のコピーを1つだけ作成し、そのポインタを返します。 a_dict = {'a':[]、 'b':[]、c ':[]}のように初期化されている場合、コードは期待どおりに動作します。
yet_another_dict = {キー:[] [ 'A'、 'B'、 'C​​']におけるキーの}

知られているものと

は、答えが提案dict.fromkeys all point to same list

で重複を発見しました

1

fromkeys()メソッドは、指定された要素のシーケンスを辞書のキーとして持つ新しい辞書を返します。

value引数が設定されている場合、新しく作成された辞書の各要素は、指定された値に設定されます。

リストやディクショナリなどの可変オブジェクト(値を変更可能)である場合、変更可能オブジェクトが変更されると、シーケンスの各要素も更新されます。

これは、各要素に同じオブジェクト(メモリ内の同じオブジェクトを指す)への参照が割り当てられているためです。

+0

これについての参考資料がありますか? ?私は[documentation](https://docs.python.org/2/library/stdtypes.html#dict.fromkeys)を確認しましたが、これについて何も見つかりませんでした –

+0

@KJPhanはい、あなたは[ ](https://www.programiz.com/python-programming/methods/dictionary/fromkeys) –

+0

@KJPhan一般的に、これはPythonの仕組みです。物は暗黙的にコピーされません。 –

0
a_dict = dict.fromkeys(['a', 'b', 'c'], []) 

これは、キー 'a'、 'b'、 'c'を持つ辞書を作成し、各キーの値は[]です。

ここで問題となるのは、各キーが同じ値を指していることです。同じ空のdictインスタンス[]がメモリにあります。

a_dict['a']a_dict['b']は(等しいと評価する)等しいだけではなく、まったく同じインスタンスです。作成した辞書には3つのキーがあり、各キーの値は同じ空のディクショナリインスタンスへのポインタです。

あなたはそれをチェックすることができます。このように

a_dict['a'] == a_dict['b'] 
# Returns True: both are equal 
a_dict['a'] is a_dict['b'] 
# Also returns True: both are the same instance 

を、dictインスタンスを共有し、a_dict['b']に影響a_dict['a']修正を修正します。

関連する問題