
[code]

    values = ["0","1","2","3","4"]
    num = ["a","b","c","d","e"]
    num_tmp = []
    
    num_tmp = num
    
    for value in values:
        num = num_tmp
        print(num)
        print(num_tmp)
        num.clear()
    
[/code]

上記にした場合、valueが1度目に関しては、`num=["a","b","c","d","e"]`となりますが、`value`が2,3,4となると、`num`も`num_tmp`も`[]`になります。`num.clear()`で`num`だけクリアしているにも関わらず、`num_tmp`もクリアされてしまうのですが、`num_tmp`がクリアされない方法ありますでしょうか？


CC BY-SA 4.0
2019-01-21T14:57:59.297
52177
2019-01-22T09:45:57.790
2019-01-21T15:07:59.673
19110
31869
question
python array
pythonの配列で異なる配列が消滅する


Python
ではリストを変数に代入した場合、実際にはそのリストオブジェクトへの参照を変数（名前）として覚えています。内部的には変数の中にメモリアドレスが格納されているイメージです。リスト
`num` に対し `num_tmp = num` と代入した場合、ふたつの変数は同じリストオブジェクトを指しており、実際 `id(num)` と
`id(num_tmp)` が一致します。リストの中身を編集しても id は変わりません。

[code]

    >>> num = [1, 2, 3]
    >>> num_tmp = num
    >>> id(num)
    2749981156232
    >>> id(num_tmp)
    2749981156232
    >>> num[1] = 42
    >>> num
    [1, 42, 3]
    >>> num_tmp
    [1, 42, 3]
    >>> id(num)
    2749981156232
    
[/code]

したがって、別オブジェクトとしてコピーすればふたつの変数が別のリストオブジェクトを指すようになります。これは [`copy.copy()` や
`copy.deepcopy()`
を使う](https://docs.python.org/ja/3/library/copy.html)ことで実現できます。

[code]

    >>> import copy
    >>> num = [1, 2, 3]
    >>> num_tmp = copy.deepcopy(num)
    >>> id(num)
    2749981251080
    >>> id(num_tmp)
    2749981251208
    >>> num[1] = 42
    >>> num
    [1, 42, 3]
    >>> num_tmp
    [1, 2, 3]
    
[/code]

あるいは一次元リストであれば次のようにコピーすることもできます。これはリスト `num` の全範囲を示すスライスから代入しています。

[code]

    >>> num_tmp = num[:]
    
[/code]

ところで、今回のサンプルプログラムのようにループ最後で毎回 `num.clear()` をするような場合、そもそも `num_tmp`
を使う必要はあるのでしょうか？ 全部 `num`
だけで行えば良いようにも見えます。おそらく実際にお使いのプログラムではないのでしょうから判断しにくいですが、本当にテンポラリの変数が必要かどうかもご一考ください。


CC BY-SA 4.0
2019-01-21T15:47:07.897
52178
2019-01-22T03:50:50.527
2019-01-22T03:50:50.527
19110
19110
52177
answer


確かにnum = num_tmp とした段階で、同じメモリidを出す様です。

[code]

    values = ["0","1","2","3","4"]
    num = ["a","b","c","d","e"]
    num_tmp = []
    num_tmp = num
    for value in values:
    　　　　num = num_tmp
    　　　　print(num)
    　　　　print(id(num))
    　　　　print(num_tmp)
    　　　　print(id(num_tmp))
    　　　　num = []  ←ここを[]に変ええました。
    
[/code]

実行しますと。

['a', 'b', 'c', 'd', 'e']  
2657197582408  
['a', 'b', 'c', 'd', 'e']  
2657197582408  
['a', 'b', 'c', 'd', 'e']  
2657197582408  
['a', 'b', 'c', 'd', 'e']  
2657197582408  
['a', 'b', 'c', 'd', 'e']  
2657197582408  
['a', 'b', 'c', 'd', 'e']  
2657197582408  
['a', 'b', 'c', 'd', 'e']  
2657197582408  
['a', 'b', 'c', 'd', 'e']  
2657197582408  
['a', 'b', 'c', 'd', 'e']  
2657197582408  
['a', 'b', 'c', 'd', 'e']  
2657197582408

となり、あら不思議num = num_tempが代入されています。

アドレスは同じ。


CC BY-SA 4.0
2019-01-22T09:45:57.790
52209
2019-01-22T09:45:57.790
30926
52177
answer