2016-12-15 2 views
2

リストのリストをループすると(私の意見では)非常に奇妙な動作が発生しました。説明するのは非常に困難であるが、ここではサンプルコードです:ループ・トラフがリストのリストを認識できない、リストがコピーであるのはなぜですか

k = [[0],[1],[2]] 

for lis in k: 
    lis_copy = lis 
    lis_copy.append(0) 
    print lis 

これを実行して、私が手:

[0, 0] 
[1, 0] 
[2, 0] 

追加されたリストがあるように、これは、私にとって非常に奇妙ですlisのコピーは ですが、lisも追加されています。私はこのリストに触れていないと思います。次の問題が発生した整数のリストと同じことをやったとえば :

k = [0,1,2] 

for num in k: 
    num_copy = num 
    num_copy = 0 
    print num 

出力:期待numをnum_copyの操作によって触れられていないのと同じように

0 
1 
2 

誰かがなぜこれが起こっているのか、これを避ける方法を説明できるのであれば、 はlis_copyをどのように切断するかのように、それは素晴らしいことでしょう。

うわー、私はこれを知らずに市長の問題に遭遇していないことに驚いています。私は自分のコードを静かに見直すべきだと思う。

How to clone or copy a list?

+0

http://stackoverflow.com/questions/184710/what -is-the-difference-a-deep-copy-and-a-shallow-copy –

+0

https://docs.python.org/3/library/copy.html –

+0

私は、ここでPythonに関する重要な知識が欠落しています - これを参照して参照を呼び出し、名前を呼び出す方法の概要をご覧ください: http://www.python-course.eu/passing_argumentsphp – wilfo

答えて

2

Pythonのリスト(とdictsが)ではないので、これは次のとおりです。とにかく私はので、私は最高の説明はここで見つけることができると思い、これは何とかループに接続され、このケースではないようだと思いました新しいリストにコピーされますが、新しいリストはそのリストへの参照になります。あなたが本当にリストをコピーしたい場合は、

+0

のような例を挙げることができます。リストのコピーが必要なのはなぜですか、私はその行動の利点がどこにあるのか疑問に思いましたか? –

1

ケースdeepcopy使用:

k = [[0],[1],[2]] 

for lis in k: 
    lis_copy = lis 
    lis_copy.append(0) 
    print lis 

を内側のリストオブジェクトへのポイントと判断我々はリストへのポインタを持っており、ループ内で、私たちは別のポインタを持っています。次に、各オブジェクトに0が追加されます。

ケースB:

k = [0,1,2] 

for num in k: 
    num_copy = num 
    num_copy = 0 
    print num 

我々はリストへのポインタを持っており、ループ内で、我々は内側の整数を指して作られた別のポインタを持っています。違いは、この場合、ポインタがリスト要素ではなくゼロオブジェクトを指すように変更されていることです。

あなたはこの動作を回避するために copy.copy()または copy.deepcopy()を使用することができ
関連する問題