2017-05-10 7 views
1

まず、この質問が非常に基本的であれば、ごめんなさい。Python:元のオブジェクトを追加するvsオブジェクトのコピーを追加する

Python 3.6がどのようにオブジェクトを作成してリストに追加するかを理解できない問題があります。 I = 0、

a_dict=dict() 
a_list=list() 

for i in range(100): 
    a_dict['original'] = i 
    a_dict['multi'] = i*2 
    a_list.append(a_dict) 

リストの印刷が私の元の考えによると

print(a_list) 
>>[{'original': 99, 'multi': 198}{'original': 99, 'multi': 198}...{'original': 99, 'multi': 198}] 

ように書きます - > 0 =元、= 0マルチ;:次のコードを参照してください。 i = 1→original = 1、multi = 2;

しかし、この質問hereによれば、Pythonのappend()は実際の値ではなくオブジェクトにポインタを追加します。だから私は(コピー)追加する私の元のコードに追記を(元)に変更します。

a_dict=dict() 
a_list=list() 

for i in range(100): 
    a_dict['original'] = i 
    a_dict['multi'] = i*2 
    a_list.append(a_dict.copy()) ##change here 

を今、私は望ましい結果を得る:

:今

print(a_list) 
[{'original': 0, 'multi': 0}, {'original': 1, 'multi': 2}, {'original': 2, 'multi': 4},...]  

を、ここで私の質問です

append()は実際にどのように動作しますか?常にリストにはポインタのようなオブジェクトがオリジナルに含まれていますか?他のタイプはどうですか?私の意図が、元の値や使用しているリスト/コンテナを直接混乱させないようにするには、私はいつもcopy()を使うべきですか?

私は自分自身を十分に説明しています。そして、それが基本的な質問であれば、再びお詫び申し上げます。ありがとう。

+2

forループの各繰り返しの開始時に新しい空白の辞書を作成しただけで、コードが簡単になります。しかし、リンクされた質問で既にカバーされているものは別として、あなたの質問が何であるかは明確ではありません。 –

+1

[リストにあるpythonのリストは常に同じ値を付加しています](http://stackoverflow.com/questions/35906411/list-on-python-appending-always-the-same-value) –

+0

@DanielRoseman、はい、私それが混乱する質問であることをご存じですか?とにかく、あなたは各ループの始めに新しい辞書について正しいです。 – AirieFenix

答えて

1

これは、追加するオブジェクトの変更可能性に関係します。オブジェクトが変更可能な場合は、それらを更新することができ、基本的には.append()関数を使用してリストへの参照を追加します。したがって、これらの状況ではコピーが必要です。

this siteには、どのタイプが可変であり、そうでないかのかなり良いリストがあります。しかし、一般的に、コンテナ型は可変である傾向がありますが、単純な値は通常不変です。

関連する問題