pythonの配列で異なる配列が消滅する

[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`がクリアされない方法ありますでしょうか？




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`
だけで行えば良いようにも見えます。おそらく実際にお使いのプログラムではないのでしょうから判断しにくいですが、本当にテンポラリの変数が必要かどうかもご一考ください。

