2016-09-14 8 views
0

は私がappend()関数の奇妙な行動だと思うものを私が遭遇した、と私は、次の単純化されたコードでそれを複製することができた:Pythonの動作が奇妙に追加されていますか?

:私はこのコードをもたらすことが期待される

plugh1 = [] 
plugh2 = [] 
n = 0 
while n <= 4: 
    plugh1.append(n) 
    plugh2.append(plugh1) 
    n = n+1 
print plugh1 
print plugh2 

plugh1 = [1, 2, 3, 4] 
plugh2 = [[1], [1, 2], [1, 2, 3, ], [1, 2, 3, 4]] 

実際の結果は:ループの実行として

plugh1 = [1, 2, 3, 4] 
plugh2 = [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]] 

、すべての配列要素がで置換されている各時間plugh1の値。

同様の質問がありますが、解決策は関数のネストとこれらの呼び出しの外での変数の定義に関連しているようです。これはずっと簡単だと思います。私は何が欠けていますか?

答えて

2

を、あなたが実際に最初のリストへの参照を追加している

plugh2.append(plugh1) 

を行うと、ないリストはそれが現在のように。したがって、あなたは

plugh1.append(n) 

を行い、次回はあなたにも、plugh2内の内容を変更しています。

このようにリストをコピーすると、後で変更されないようにすることができます。

plugh2.append(plugh1[:]) 
0

この:

plugh2.append(plugh1) 

plugh1への参照ではなくコピーを追加します。これは、将来の更新がplugh2に反映されることを意味します。コピーが必要な場合は、https://docs.python.org/2/library/copy.html

+5

'plugh2.append(plugh1 [:])' – sberry

+0

を実行するだけでもよいでしょう。 newbを助けてくれてありがとう。乾杯 –

1

この理由は、リスト自体をコピーするのではなく、リストを参照することだけです。実行してみましょう:

print(pligh2[0] is pligh2[1]) 
#: True 

リストの各要素は、「ある」彼らはすべて同じオブジェクトであるため、他のすべての要素。あなたはこの自分自身を示していますをコピーしたい場合は

、試してみてください。

plugh2.append(plugh1[:]) 
# or 
plugh2.append(plugh1.copy()) 
関連する問題